我正在尝试使用使用以下编码的WCF调用Web服务:
<?xml version="1.0" encoding="ISO-8859-1" ?>
我无法更改此Web服务的编码。我已经生成了一个wcf代理,当我尝试调用代理时,我收到以下错误:
FailedSystem.ServiceModel.ProtocolException: 内容类型text / xml; charset = ISO-8859-1的回复 消息与内容不匹配 绑定的类型(text / xml; 字符集= UTF-8)。如果使用自定义 编码器,请确保 IsContentTypeSupported方法是 正确实施。
有谁知道如何使用wcf调用不是UTF-8的网络服务?
答案 0 :(得分:23)
不幸的是,你不能在WCF中开箱即用。
我遇到了同样的问题,并提出了一个可以使用的自定义绑定(在配置或代码中)。它基于HTTP传输,如果对您有所帮助,我可以在此处发布自定义配置,或者向您发送绑定的C#代码链接。
这个MSDN page here显示了如何创建一个“CustomTextEncoder”,它可以支持超过utf-8,utf-16和unicode编码。它包含完整的示例源代码,对我来说非常有用。
此blog post here显示了在尝试使自定义文本编码器正常工作时需要考虑的其他一些事项。
希望有所帮助。
马克
<强>更新强>
根据我上面提到的用于CustomTextEncoder的Microsoft示例,您可以轻松地使用ISO-8859-1文本消息编码创建自定义绑定 - 只需使用此配置片段(假设您已下载并编译并引用该Microsoft示例):
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="customTextMessageEncoding"
type="Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement,
Microsoft.ServiceModel.Samples.CustomTextEncoder"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="ISO8859Binding" >
<customTextMessageEncoding encoding="ISO-8859-1" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<client>
<endpoint name="Test"
address="......."
binding="customBinding"
bindingConfiguration="ISO8859Binding"
contract="IYourContract" />
</client>
</system.serviceModel>
您可以在我的Skydrive目录WCF ISO 8859-1 Encoding上找到该代码,以及基本上将整个配置包装到代码中的ISO88591Binding
。但请注意 - 这是基于我当时的要求,例如我的服务我需要与所需的https,以及其他一些有点糟糕的设置进行对话,因此如果需要,您可能需要调整它们或使它们在配置中可配置。 ISO88591Binding“项目还包含一个netHttpBinding,它再次是Microsoft提供的示例,我曾经习惯于在代码中编写自己的自定义绑定。
在WCF中编写自定义绑定绝对是可能的 - 但对于胆小的人来说并非如此......
答案 1 :(得分:8)
另一种选择是使用较旧的.NET Framework 2.0 ASMX WebServices技术,该技术支持iso-8859-1
开箱即用:
如果服务使用基本HTTP身份验证,您可以这样指定:
TheService theService = new TheService();
theService.Credentials = new NetworkCredential("username", "password");
答案 2 :(得分:7)
在此link中,您可以下载文件以进行自定义绑定,并在代码中执行以下操作:
CustomBinding binding = new CustomBinding(
new CustomTextMessageBindingElement("iso-8859-1", "text/xml", MessageVersion.Soap11),
new HttpTransportBindingElement());
myWebService client = new myWebService();
client.Endpoint.Binding = binding;
答案 3 :(得分:2)
如果您不想处理大量下载的代码和低级实现,您可以使用HttpWebRequest类使用旧样式请求来解决问题,如here所述。现在,您将免除接口的自动化代码和工具,并将使用手动Xml解析。