我的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所证实的那样。)
但是,我的WCF服务的[OperationContract]标记方法都报告Product.Description属性的值为“Foo \ nBar \ n \ nFinal line”。这是在调用我的任何代码之前发生的。
在WCF的某个地方,字符串中的\ r \ n换行符被删除并替换为\ n换行符,但我看不出发生这种情况的原因或原因。
答案 0 :(得分:3)
这实际上是由XML规范强制执行的 - http://www.w3.org/TR/REC-xml/#sec-line-ends:“XML解析器在解析之前通过翻译两者来表现就像它在输入上规范化外部解析实体(包括文档实体)中的所有换行符一样 - 字符序列#xD #xA和任何#xD后面没有#xA到单个#xA字符“。
如果要保留“\ r”,则必须先将其转义(进入
),然后再将其发送到服务器,以免它被标准化。
<product>
<description>Foo
\nBar
\n
\nFinal line</description>
</product>
如果您使用XmlWriter
生成此XML,则可以创建一个传递XmlWriterSettings
且其NewLineHandling属性设置为NewLineHandling.Entitize
的XML,这将为您完成。< / p>