【问题标题】:Calling a webservice that uses ISO-8859-1 encoding from WCF从 WCF 调用使用 ISO-8859-1 编码的 Web 服务
【发布时间】:2009-12-15 15:01:34
【问题描述】:

我正在尝试使用使用以下编码的 WCF 调用 Web 服务:

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

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

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

有人知道我如何使用 wcf 调用非 UTF-8 的 Web 服务吗?

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    您不能在 WCF 中开箱即用地执行此操作 - 很遗憾。

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

    这个MSDN page here 展示了如何创建一个“CustomTextEncoder”,它可以支持超过 utf-8、utf-16 和 unicode 编码。它包含完整的示例源代码,对我来说非常有用。

    blog post here 显示了在尝试使自定义文本编码器正常工作时需要考虑的一些其他事项。

    希望对您有所帮助。

    马克

    更新:
    基于我上面提到的用于 CustomTextEncoder 的 Microsoft 示例,您可以轻松地使用 ISO-8859-1 文本消息编码创建自定义绑定 - 只需使用此配置的 sn-p(假设您已下载并编译并引用了该 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 中编写自定义绑定绝对是可能的 - 但对于胆小的人来说并不是真的......

    【讨论】:

    • 如果您可以发布配置和代码的链接,那就太好了。我认为这是 WCF 的严重失败。
    • 并非如此 - 整个 Internet 和 SOA 世界确实基于 Unicode 标准。在我看来,即使必须处理 ISO-8859-1 也是一种失败,不仅仅是 WCF 不支持它开箱即用......
    • 我使用 CustomTextMessageEncodingElement,但出现错误:内容类型 text/xml;响应消息的 charset=ISO-8859-1 与绑定的内容类型不匹配 (text/xml;charset=iso-8859-1)。如果使用自定义编码器,请确保正确实现 IsContentTypeSupported 方法。响应的前 1024 个字节是:
    • @alhambraeidos:我的解决方案中有一个文件ISO88591HttpsBindingCollectionElement.cs - 应该是该文件; sample.config 无效 - 该行应该是:&lt;add name="ISO88591HttpsBinding" type="CustomISOBinding.ISO88591HttpsBindingCollectionElement, ISO88591Binding" /&gt; - 对此感到抱歉。
    • Marc,是否有可能,如果答案是“是” - 如何在自定义绑定中添加 http 级别的授权?我已经查看了您的解决方案,但找不到这样的东西(或者我没有找对地方)。谢谢。
    【解决方案2】:

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

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

    TheService theService = new TheService();
    theService.Credentials = new NetworkCredential("username", "password");
    

    【讨论】:

    • 这对我有用,可以将我的 C# 客户端连接到 php soap 服务器
    【解决方案3】:

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

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

    【讨论】:

    • 我需要把这个代码和下载的东西放在哪里,我也遇到了这个问题以及如何解决它
    【解决方案4】:

    如果您不想处理大量下载代码和低级实现,您可以通过使用 HttpWebRequest 类的旧式请求来解决问题,如 here 所述。现在,您将免除接口的自动化代码和设施,并使用手动 Xml 解析。

    【讨论】:

      猜你喜欢
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2011-02-12
      相关资源
      最近更新 更多