为什么默认情况下 WCF 不支持 UTF-8 和 UTF-16 以外的其他编码?



我们发布的WCF SOAP服务存在一些问题,该服务由我们的一个客户使用。问题是,客户将SOAP请求编码为ISO-8859-1,从而导致错误消息:

HTTP/1.1 415无法处理消息,因为内容类型为'text/xml;charset=iso-8859-1"不是预期的类型"text/xml;charset=utf-8'。

显然,WCF只支持UTF-8和UTF-16 big-endianhttp://msdn.microsoft.com/en-us/library/ms751486(v=VS.90).aspx。在SO:上的这些问题中也讨论了这个问题

  • 从WCF调用使用ISO-8859-1编码的Web服务
  • WCF异常:文本消息编码和ISO-8859-1编码

虽然我同意unicode是首选,但我不能强迫我们的客户更改他们的客户,所以我必须修复我们的服务。

我需要把一些MSDN作者写的150行以上的代码放进我的项目中,这让我很恼火-我无法维护这些代码,也无法对此负责。我还花了很多时间在谷歌上寻找解决方案,并试图理解它们,我觉得这是在浪费时间,因为WCF可以开箱即用。

我的问题是:微软有充分的理由以这种方式实现WCF吗SOAP不应该使用ISO-8859-1是否有技术原因?对我来说,这似乎违反了Postel定律,拒绝了几乎任何XML解析器都可以处理的消息。

显然,这在SOAP 1.2规范中是允许的,请参阅第4.2节:

如果使用XML信息集的XML序列化,则绑定可以强制执行使用特定的字符编码或一组编码。

在这种情况下,WCF选择只支持UTF-8和UTF-16,而不支持其他编码。

一种解决方法是使用HttpWebRequest类以"旧时代"的方式使用服务,如下所述。您将不得不处理纯Xml来进行请求和其他很酷的事情,但工作正常!

最新更新