c# - 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# - 在添加 Own LinearLayout 期间无法激活 JNI 句柄 - Xamarin Android
- java - 如何通过分页搜索任何字段
- php - 从数据库中选择 MySQL 在输入文本 html 中显示值 从另一个输入文本 html 中按值选择
- prolog - Prolog 处理二维数组和未绑定变量
- apache - TYPO3 9:默认 htaccess 文件不能作为包含在 apache 网络服务器的虚拟主机中工作
- linux - Linux 下带有 dotnet core 的 LDAP
- python - 在 Django Rest Framework Serializer 中,如何获取图像的完整路径?
- python - 在 matplotlib 中关闭刻度标签的指数表示法的 TeX 模式
- android - Oreo 版本,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY 不崩溃,但没有效果
- python - 计算元组列表中的出现次数