Проблема с кодировкой ответа веб-службы

Я разрабатываю веб-службы на основе веб-службы ASP.Net asmx. Сторона сервера ответит клиенту byte [] в кодировке UTF-8, а клиент - преобразовать byte [] в строку.

Мое замешательство заключается в том, что символ фунта Англии на стороне сервера (я сбрасываю непосредственно перед записью ответа Http, и символ на стороне сервера правильный, чтобы быть фунтом Англии) будет получен как ?? со стороны клиента.

Есть идеи, что не так? Я подозреваю, что это проблема с кодировкой, но я не знаю, как отлаживать дальше и какие настройки (настройки из прокси-сервера клиентской веб-службы?), Которые повлияют?

Вот часть заголовка, которую я получил от Fiddler.

HTTP / 1.1 200 OK Дата: Пт, 20 февраля 2009 г., 16:51:30 GMT Сервер: Microsoft-IIS / 6.0 cache-control: no-cache pragma: no-cache X-Powered-By: ASP.NET X-AspNet- Версия: 2.0.50727 Cache-Control: private Content-Type: text / xml Content-Length: 22752

xml version = "1.0" encoding = "utf-8"


person George2    schedule 20.02.2009    source источник
comment
см. также: stackoverflow.com/questions/10221051/   -  person fungchou    schedule 17.10.2012


Ответы (1)


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

Fiddler хорош в качестве прокси-сервера HTTP, или вы можете использовать WireShark для прослушивания на уровне сети.

Получив эти три бита информации (заголовок Content-Type, объявление XML и байты, составляющие знак фунта), если вы обновите свой ответ, мы посмотрим, что мы можем сделать. Это действительно звучит странно, поскольку обычно ASP.NET все делает правильно.

Как выглядит ваш клиентский код? Это тоже обычный клиентский код веб-службы .NET?

РЕДАКТИРОВАТЬ: попробуйте найти двоичный (шестнадцатеричный дамп) дисплей в Fiddler, чтобы вы могли найти байты.

Однако я сильно подозреваю, что проблема просто в выгрузке результата в консоль. Вот небольшой код, который можно использовать для сброса кодовых точек Юникода:

static void DumpString (string value)
{
    foreach (char c in value)
    {
        Console.Write ("{0:x4} ", (int)c);
    }
    Console.WriteLine();
}

Я подозреваю, что вы увидите на выходе 00A3, который является Unicode для знака фунта. Это означает, что строка действительно дошла до вашего клиента, но записать ее в консоль не удается.

person Jon Skeet    schedule 20.02.2009
comment
Я только что использовал Fiddler и опубликовал ответ. Есть идеи, гуру? :-) - person George2; 20.02.2009
comment
Я обнаружил в Fiddler, что содержимое правильно отображается как английский фунт, но в полученном мной возвращаемом значении строки содержимое равно ?? (Выкидываю в консоль и вижу ??). - person George2; 20.02.2009
comment
Я считаю, что знак доллара США может отображаться правильно. Означает ли это, что кодировка по умолчанию UTF-8 не работает для английского фунта, но работает для доллара США? :-) - person George2; 20.02.2009
comment
$ является частью ASCII, а знак фунта - нет. Я отредактировал свой ответ - я сильно подозреваю, что это просто ваша консоль, а не клиент веб-службы, но я дал вам код для проверки. - person Jon Skeet; 20.02.2009
comment
Джон, я следил за вашим решением, чтобы отладить его, оно отображается как 003F 003F для ??, а не как 003A. Любые идеи? - person George2; 20.02.2009
comment
Я отлаживал шестнадцатеричный вид в Fiddler, соответствующее значение - C2 A3 для английского фунта, есть идеи? - person George2; 20.02.2009
comment
C2 A3 подходит для кодировки UTF-8 U + 00A3 - так что это определенно где-то в клиентском коде. Учитывая, что XML явно определяет UTF-8, это очень странно. - person Jon Skeet; 20.02.2009
comment
Джон, мой клиентский код очень прост, просто получаю строку C # и пишу в консоль. Судя по нашему обсуждению, Fiddler может отображать английский фунт, я думаю, это означает, что контент на проводе правильный? Я подозреваю, что что-то не так, когда проблема с декодированием встроенного кода cient proxy. Есть комментарии или идеи? - person George2; 20.02.2009
comment
Я мог достать ?? из двух мест, из Console.writeline и из остановки указателя мыши на строковой переменной с сервера. Есть идеи, что не так? - person George2; 20.02.2009
comment
C2 A3 является правильным для кодировки UTF-8 U + 00A3 - это доказывает правильность содержимого на проводе. Но что-то не так, когда автоматически сгенерированный прокси декодирует байты UTF-8 в строку? - person George2; 20.02.2009
comment
У меня есть новая идея, что-то не так с моей текущей настройкой локали? Я использую Windows Server 2003 x64 на стороне клиента. - person George2; 20.02.2009
comment
Да, похоже, это так. Под клиентом я подразумеваю код, который получает ответ от сервера и, кстати, его декодирует. - person Jon Skeet; 20.02.2009
comment
Привет, Джон Скит! Я не добавляю никакого дополнительного кода, кроме кода прокси-сервера клиента веб-службы, сгенерированного прямым добавлением веб-ссылки. Любые комментарии и идеи, что не так, и дальнейшее расследование? - person George2; 21.02.2009
comment
Так что это просто нормальный бесшумный код - он действительно должен нормально работать. Это просто веб-метод, возвращающий строку? - person Jon Skeet; 21.02.2009
comment
На стороне сервера это обработчик ashx, который, наконец, записал сообщение SOAP как byte [] в поток ответов текущего HttpContext. Я думаю, что по результатам Fiddler информация должна быть правильной на проводе, правильной (так что, я полагаю, сервер правильный)? Любые идеи? - person George2; 21.02.2009
comment
Что ж, это определенно выглядит правильным из того, что вы нам сказали, но сложно сказать наверняка - может быть какая-то важная информация, которую мы упускаем. Что конкретно делает обработчик ashx? Что произойдет, если вместо этого вы просто поговорите напрямую с обработчиком SOAP? - person Jon Skeet; 21.02.2009
comment
Привет, Джон Скит, я проверяю свой код ashx, но теперь я подозреваю больше о проблеме на стороне клиента, кроме проблемы на стороне сервера, поскольку Fiddler отображает правильную информацию. И еще один быстрый вопрос, какие факторы у клиента могут повлиять на результаты декодирования? Какие-либо настройки в самом прокси-сервере клиента? - person George2; 22.02.2009