首页 > 解决方案 > CRLF 的 DataContractSerializer 和 WCF 服务响应处理明显不一致

问题描述

背景

如果我正确阅读了 W3 规范https://www.w3.org/TR/REC-xml/#sec-line-ends,则在 XML 中返回 CR LF (\r\n) 或仅返回 CR 是无效的元素值(即表示换行符)。它必须只是LF。

有一些对 DataContractSerializer “自动处理”的引用,我可以看到它所做的替换如下:(\r\n => 
\n即 CR 已转义为其字符实体,只留下 LF)。

但是,如果我的 WCF 服务响应(WCF 使用 DataContractSerializer)将包含 CRLF 的字符串序列
\n化为如上所述,一些(非 Windows)客户端应用程序(不在我的控制范围内)无法反序列化 XML,因为“它不是有效的 XML”(他们声称)。他们声称这\n是有效的,但不是
\n

它是否真的是有效的 XML 不是问题 - 客户端无法重新编码,但服务可以,所以我需要在服务端做一些事情来转换\r\n => \n

我的问题 - 如果我手动删除 CR,WCF 服务响应似乎将其放回原处!

因此,在被序列化以响应 WCF 方法调用的类中,我在字符串中进行了简单的替换,如下使用扩展方法:

[DataMember(IsRequired = true, Order = 3)]
public string Address
{
    get { return Data.Address.MakeXmlSafe(); }
    internal set { }
}

public static string MakeXmlSafe(this string source)
{
    if (string.IsNullOrEmpty(source))
        return source;

    // In XML it is not valid to return CR LF (\r\n) or just CR (\r) as a newline. It must be just LF (\n).
    return source.Replace("\r\n", "\n").Replace("\r", "\n");
}

(仅供参考,该服务是 .NET Framework 4.6)

调试服务,我可以看到替换正确。但是,如果我在 SOAPUI 或WCF 服务跟踪查看器工具(SvcTraceViewer.exe) 等工具中检查响应,则换行符表示为 CR LF (\r\n)。

为了理智,我还测试了使用 DataContractSerializer 手动序列化可以保留没有 CR 的 LF,它确实: 当地人

我不知道这些工具(作为 Windows 应用程序)是否会自动将 LF 替换为 CR LF,以便渲染它。还是 WCF 在 DataContractSerializer 之后进行替换?如果是这样,我能做些什么来保证转换\r\n => \n(而不是\r\n => 
\n)?

标签: c#xmlwcfxml-serializationdatacontractserializer

解决方案


推荐阅读