调用从WCF使用ISO-8859-1编码的Web服务

dag*_*da1 27 .net wcf

我试图使用使用以下编码的WCF调用Web服务:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
Run Code Online (Sandbox Code Playgroud)

我无法更改此Web服务的编码.我已经生成了一个wcf代理,当我尝试调用代理时,我收到以下错误:

FailedSystem.ServiceModel.ProtocolException:内容类型text/xml; charset =响应消息的ISO-8859-1与绑定的内容类型(text/xml; charset = utf-8)不匹配.如果使用自定义编码器,请确保正确实现IsContentTypeSupported方法.

有谁知道如何使用wcf调用不是UTF-8的web服务?

mar*_*c_s 24

你不能在WCF中开箱即用 - 不幸的是.

我遇到了同样的问题,并提出了一个可以使用的自定义绑定(在配置或代码中).它基于HTTP传输,如果对您有所帮助,我可以在此处发布自定义配置,或者向您发送绑定的C#代码链接.

这里的MSDN页面显示了如何创建一个"CustomTextEncoder",它可以支持超过utf-8,utf-16和unicode编码.它包含完整的示例源代码,对我来说非常有用.

此博客文章显示了在尝试使自定义文本编码器正常工作时需要考虑的一些其他事项.

希望有所帮助.

渣

更新:
基于我上面提到的用于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>
Run Code Online (Sandbox Code Playgroud)

您可以ISO88591Binding在我的Skydrive目录WCF ISO 8859-1编码上找到该代码,以及基本上将整个配置包装到代码中的代码.但请注意 - 这是基于我当时的要求,例如我的服务我需要与所需的https进行通信,还有其他一些有点糟糕的设置,因此您可能需要调整它们或使它们在配置中可配置, 如果需要的话.ISO88591Binding"项目还包含一个netHttpBinding,它再次是Microsoft提供的示例,我曾经在代码中编写自己的自定义绑定.

在WCF中编写自定义绑定绝对是可能的 - 但对于胆小的人来说却并非如此......


Sae*_*ini 8

另一个选择是使用旧的.NET Framework 2.0 ASMX WebServices技术,该技术支持iso-8859-1开箱即用:

在此输入图像描述

在此输入图像描述

如果服务使用基本HTTP身份验证,您可以像这样指定它:

TheService theService = new TheService();
theService.Credentials = new NetworkCredential("username", "password");
Run Code Online (Sandbox Code Playgroud)


Jua*_*lez 7

在此链接中,您可以下载用于进行自定义绑定的文件,并在代码中执行以下操作:

CustomBinding binding = new CustomBinding(
   new CustomTextMessageBindingElement("iso-8859-1", "text/xml", MessageVersion.Soap11),
   new HttpTransportBindingElement());

myWebService client = new myWebService();

client.Endpoint.Binding = binding;
Run Code Online (Sandbox Code Playgroud)