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" был сохранен, вы должны избежать его (в 
) перед отправкой на сервер, чтобы он не нормализовался.
<product>
<description>Foo
\nBar
\n
\nFinal line</description>
</product>
Если вы производите этот XML с XmlWriter
Вы можете создать один проход XmlWriterSettings
со свойством NewLineHandling, установленным в NewLineHandling.Entitize
, и это будет сделано для вас.