Чтобы показать эту фундаментальную проблему в .NET и причину этого вопроса, я написал простой тестовый веб-сервис с помощью одного метода (EditString) и приложения потребительской консоли, которое его вызывает.Как обрабатывать специальные символы в строках в веб-службе?
Они оба стандартных веб-сервис/консольных приложений, созданных с помощью File/New Project и т.д., поэтому я не буду перечислять весь код - только методы в вопросе:
Web метод:
[WebMethod]
public string EditString(string s, bool useSpecial)
{
return s + (useSpecial ? ((char)19).ToString() : "");
}
[Вы можете видеть, что он просто возвращает строку s, если useSpecial является ложным. Если useSpecial верно, то возвращает s + символ 19.]
консоли приложение:
TestService.Service1 service = new SCTestConsumer.TestService.Service1();
string response1 = service.EditString("hello", false);
Console.WriteLine(response1);
string response2 = service.EditString("hello", true); // fails!
Console.WriteLine(response2);
[Второй ответ не удается, так как метод возвращает привет + специальный символ (код ASCII 19 ради аргумента) .]
ошибка:
Существует ошибка в документе XML (1, 287)
Внутреннее исключение: "'', шестнадцатеричное значение 0x13, является недопустимым символом. Строка 1, позиция 287.»
Несколько точек стоит отметить:
Веб-метод сам по себе отлично работает при просмотре непосредственно в файл ASMX (например
http://localhost:2065/service1.asmx
), и работает метод через это (с теми же параметрами, что и в консольном приложении), то есть отображает XML со строкой hello + char 19.Проверка последовательного XML другими способами показывает, что специальный символ кодируется должным образом (кажется, что SERVER SIDE быть в порядке w Хич ХОРОШО)
Так что, похоже Клиентская сторона имеет вопрос - то есть .NET генерируется прокси-код класса не обрабатывает специальные символы
Это является частью более крупного проекта, в котором объекты передаются в и из веб-методов, которые содержат строковые атрибуты, - вот что нужно для правильной работы. т.е. мы де-сериализуем классы.
Любые предложения по обходному пути и как его реализовать?
Или я полностью пропустил что-то действительно очевидное !!?
PS. Мне не повезло с тем, что он использовал теги CDATA (поддерживает ли .NET их из коробки?).
Попробует, и спасибо за быстрый ответ! Может быть, аккуратное решение - просто нужно смотреть кодировку? Если XML говорит, что UTF8 - безопасная ставка - это кодировка, используемая для массива байтов? (Я хотел бы разрешить символы Unicode.) – 2009-05-17 19:59:40
Вам не нужно беспокоиться о кодировке. Сериализатор будет кодировать его как base64 от вашего имени. Не беспокойся. –