WCF 服务因特殊字符而失败

Posted

技术标签:

【中文标题】WCF 服务因特殊字符而失败【英文标题】:WCF service fails on special characters 【发布时间】:2014-04-06 00:31:36 【问题描述】:

我有一个 C# WCF 服务正在运行,它需要接受 ISO-8859-1 中的消息。一切正常,直到有人发送包含特殊字符(例如 äö)的消息。

如果字符被编码(ä\344ä)一切正常,但发件人坚持如果邮件是 ISO-8859-1,则不需要转义。

更具体地说,这是可行的(简化示例):

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    a
  </soap:Body>
</soap:Envelope>

(当然会因为语法无效而引发另一个异常,但传输本身很好)。

这不起作用:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    ä
  </soap:Body>
</soap:Envelope>

并抛出一堆神秘的错误消息,无处可去:

<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, ...</ExceptionType>
<Message>The I/O operation has been aborted because of either a thread exit or an application request</Message>
...
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, ...</ExceptionType>
<Message>An operation was attempted on a nonexistent network connection</Message>

我尝试使用空的 App.config 运行服务,但问题仍然存在,所以我很确定问题不在于我创建服务的方式,而在于 WCF 处理消息的方式.将编码更改为 UTF-8 也无济于事。

知道为什么单个变音符号会如此灾难性地破坏服务吗? XML 应该支持 ASCII 以外的编码,那么这里有什么问题呢?有什么我可以做的改变,或者如果所有希望都落空了,我怎么能说服发件人对他们的特殊字符进行编码?

【问题讨论】:

类似问题:***.com/questions/5369462/… 可能有帮助。 【参考方案1】:

问题不是我想的那样。

客户发送给我们的数据缺少正确的 xml 声明:

<?xml version="1.1" encoding="ISO-8859-1"?>

这样,服务就可以正常工作了。

但是我得到的异常是由我们自己测试连接的程序引起的。该程序是 WebServiceStudio,当我们尝试通过它发送特殊字符(特别是 ä)时,它完全失败了:使用 WireShark 检查时,消息正文完全不存在。

所以,最初我们认为客户和我们遇到了同样的问题,但是当我们注意到我们的测试失败时,很快就找到了真正的原因,那就是 SOAP 消息中缺少 XML 声明。

【讨论】:

以上是关于WCF 服务因特殊字符而失败的主要内容,如果未能解决你的问题,请参考以下文章

WCF中的特殊字符

如果 Json 变量在 WCF 中包含空格或任何特殊字符,如何获取 Json 值

大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败

iOS URL带特殊字符(汉字、空格等)导致图片加载失败

因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考

因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考