WCF и пользовательская кодировка текста - грязное дело

У меня действительно странная проблема с WCF...

Мы подключаемся к дрянному стороннему веб-сервису; это был кошмар, чтобы даже запустить его, нам пришлось создать пользовательскую привязку WCF, так как эти ребята решили использовать «ISO-8859-1» в качестве кодировки текста (вместо UTF-8, как все остальные в Интернете), и другие настройки тоже были беспорядочными - и нигде не документированы, конечно...

Некоторое время он работал нормально, но вдруг некоторые из наших данных возвращаются в искаженном виде. Мы ожидаем вернуть названия мест, и, поскольку они находятся в Швейцарии, в некоторых из них есть немецкие умляуты. Но за последние два-три месяца мы вдруг возвращаемся

Hünibach

вместо надлежащего

Hünibach

Таким образом, ü (у умлаут) искажен.

Нет проблем, я решил, что они, наконец, перешли на UTF-8, и я изменил свою пользовательскую привязку, чтобы использовать UTF-8 в качестве текстового кодировщика вместо ISO-8859-1 - но не повезло - нет, я получаю:

ИСКЛЮЧЕНИЕ: System.ServiceModel.Security.MessageSecurityException
HTTP-запрос запрещен со схемой проверки подлинности клиента «Базовая».

Что за хрень????? Служба защищена именем пользователя/паролем, которые мы передаем с помощью ClientCredentials WCF. Кажется, что изменение кодировки текста каким-то образом портит учетные данные!?!?! Странный.....

ОК - вернемся к ISO-8859-1, и я только что попытался интерпретировать полезную нагрузку ответа как UTF-8 - снова не повезло :-( Пробовал с UTF-16, UTF-32, даже UTF-7, Unicode, BigEndianUnicode - все но безрезультатно.

Так как же мне вернуть свои правильные умлауты и при этом иметь возможность вызывать эту чертову службу... прекрасно работает в SoapUI, кстати......

Есть идеи?? Я отчаянно хватаюсь за любую соломинку, которую вы можете мне бросить!!


person marc_s    schedule 20.03.2011    source источник
comment
Я понятия не имею, почему это происходит, но вы можете попытаться получить необработанные сообщения (байты) и попытаться расшифровать их с помощью UTF-8, Latin 1 и чего-либо еще, чтобы проверить, как изменяется полезная нагрузка. Если вы используете простой HTTP, вы можете использовать Fiddler для получения сообщений. Другая идея заключается в том, что обычно получение ответов в одной кодировке не означает, что сервер ожидает запросы в той же кодировке.   -  person Ladislav Mrnka    schedule 21.03.2011


Ответы (2)


Попробуйте проверить данные, которые вы получаете, и посмотрите, какие числовые коды они используют для их представления. Умлаут — один из тех символов в 8859-1, который имеет общий код с другими символами.

См. второй абзац в - http://en.wikipedia.org/wiki/%C3%9C#Typography

person Naraen    schedule 23.03.2011

Собственно, я наконец-то понял, в чем была проблема.

По какой-то причине изменение образца CustomTextEncoder (предоставленного Microsoft в примерах WCF и WF) для использования UTF-8 вместо ISO-8859-1 не работает.

С другой стороны, удаление пользовательского текстового кодировщика из моей пользовательской привязки и просто использование стандартного TextMessageEncoder, который WCF предоставляет с самого начала (который по умолчанию использует UTF-8), сработало.

Не спрашивайте меня почему.... это просто факты, которые я нашла.....

person marc_s    schedule 12.04.2011