2009-05-17 4 views
1

Чтобы показать эту фундаментальную проблему в .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 их из коробки?).

ответ

0

Вам нужно будет использовать байт [] вместо строк.

+0

Попробует, и спасибо за быстрый ответ! Может быть, аккуратное решение - просто нужно смотреть кодировку? Если XML говорит, что UTF8 - безопасная ставка - это кодировка, используемая для массива байтов? (Я хотел бы разрешить символы Unicode.) – 2009-05-17 19:59:40

+0

Вам не нужно беспокоиться о кодировке. Сериализатор будет кодировать его как base64 от вашего имени. Не беспокойся. –

0

Я думаю о некоторых вариантах, которые могут вам помочь. Вы можете выполнить маршрут, используя html-объекты вместо char (19). или, как вы сказали, вы можете использовать CDATA.

Чтобы придумать чистое решение, вы можете не захотеть переложить все это на CDATA. Я не уверен, почему вы думаете, что это может не поддерживаться в .NET. Вы говорите это в контексте сериализации?

+0

Да в контексте сериализации - все это обрабатывается за кулисами веб-службой .NET и прокси-классом. Я действительно не хотел, чтобы мои руки были грязными (или считали, что это должно быть необходимо) сериализации, и просто будет атрибут xml, который я мог бы использовать, чтобы сделать сериализацию тега CDATA вокруг моей строки ... Данные описания продуктов, поступающие из базы данных для веб-сайта, который, как известно, содержит специальные символы, и я просто хочу, чтобы мой веб-сервис обрабатывал его. (Этот пример просто показывает, что .NET падает, казалось бы, без лишнего колдовства ...) – 2009-05-17 20:04:12

+0

Вы пытались использовать маршрут html-сущностей? Он может стать сложным, если вам нужно выследить множество из них. –