WCF и нестандартное кодирование текста - грязное дело - PullRequest
4 голосов
/ 20 марта 2011

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

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

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

Hünibach

вместо правильного

Hünibach

Итак, ü (умля) искажен.

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

ИСКЛЮЧЕНИЕ: System.ServiceModel.Security.MessageSecurityException
HTTP-запрос был запрещен с помощью схемы аутентификации клиента «Basic».

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

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

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

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

На самом деле, я наконец понял, в чем проблема.

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

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

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

1 голос
/ 24 марта 2011

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

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

...