WCF 3.5 REST - элемент данных, \ r \ n замененный на \ n - PullRequest
1 голос
/ 29 декабря 2011

Моя служба RESTful WCF 3.5 принимает объект данных XmlSerialized (в отличие от сериализованного DataContract), который содержит поле строки произвольной формы.

Написанный мной клиент (который использует HttpWebRequest / HttpWebResponse для взаимодействия со службой WCF)отправляет XML следующим образом:

<product>
    <description>Foo\r\nBar\r\n\r\nFinal line</description>
</product>

(символы CR и LF здесь экранированы для разборчивости, в действительности необработанные байты ASCII 0x0A и 0x0D отправляются по проводам, как подтверждено Wireshark).

Однако все методы, помеченные [OperationContract] моей службы WCF, сообщают, что свойство Product.Description имеет значение "Foo \ nBar \ n \ nFinal line".Это происходит до того, как будет вызван любой мой код.

Где-то в WCF символы \ r \ n новой строки в строках удаляются и заменяются \ n символами новой строки, но я не вижу, где и почему это происходит.

1 Ответ

3 голосов
/ 29 декабря 2011

Это на самом деле предписано спецификацией XML - http://www.w3.org/TR/REC-xml/#sec-line-ends: "процессор XML ДОЛЖЕН вести себя так, как если бы он нормализовал все разрывы строк во внешних проанализированных объектах (включая объект документа) при вводе, перед синтаксическим анализом, путем перевода обоих двух -символ последовательности #xD #xA и любой #xD, за которым не следует #xA до одного символа #xA ".

Если вы хотите, чтобы "\ r" был сохранен, вы должны экранировать его (в &#xD;) перед отправкой на сервер, чтобы он не нормализовался.

<product>
    <description>Foo&#xD;\nBar&#xD;\n&#xD;\nFinal line</description>
</product>

Если вы создаете этот XML с XmlWriter, вы можете создать его с передачей XmlWriterSettings со свойством NewLineHandling, установленным на NewLineHandling.Entitize, и это будет сделано для вас.

...