WCF 3.5 REST - элемент данных, \r\n замененный на \ n

Моя служба 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 ответ

Решение

Это на самом деле предписано спецификацией XML - http://www.w3.org/TR/REC-xml/: "Процессор 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, и это будет сделано для вас.

Другие вопросы по тегам