WCF 3.5 REST - 将数据成员\ r \ n替换为\ n

问题描述:

我的RESTful WCF 3.5服务接受包含自由格式字符串字段的XmlSerialized(而不是DataContract序列化)数据对象。WCF 3.5 REST - 将数据成员 r n替换为 n

我写的客户端(它使用的HttpWebRequest/HttpWebResponse与WCF服务进行交互)发送XML这样的:

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

(CR和LF字符在这里逃过易读性,现实中的原始ASCII字节0x0A和0x0D在Wireshark中发送,如Wireshark所确认的)。

但是,我的WCF服务的[OperationContract]标记方法都报告Product.Description属性的值为“Foo \ nBar \ n \ nFinal line”。这发生在我的任何代码被调用之前。

在WCF的某个地方,字符串中的\ r \ n换行符将被删除并替换为\ n换行符,但我无法看到发生在何处或原因。

这实际上是由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.Entitize其NewLineHandling属性,这会为你做。

+0

太好了,谢谢! – Dai 2011-12-30 16:36:44