在使用客户端Web服务时获取内容mismtach的错误

时间:2016-02-01 07:44:49

标签: c# web-services wcf

我在使用客户端网络服务时遇到以下错误。

  

错误:响应消息的内容类型text / xml; charset = utf-8与绑定的内容类型(application / soap + msbin1 + gzip)不匹配。如果使用自定义编码器,请确保正确实现IsContentTypeSupported方法。

     

响应的前807个字节是:

     

'                                 soapenv:客户端               必须使用HTTP压缩(RFC 1952 - GZIP)发送请求消息。请查看位于https://www.irs.gov/for-Tax-Pros/Software-Developers/Information-Returns/Affordable-Care-Act-Information-Return-AIR-Program的“AIR提交作文和参考指南”第5节中概述的传输说明,更正所有问题,然后重试。                                 TPE1112                                                       '。==========================错误:System.Net.WebException:远程服务器返回错误:(500)内部服务器错误。      在System.Net.HttpWebRequest.GetResponse()      at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

我知道有很多关于此错误的文章,但我无法获得解决方案或提示,如何解决此问题?

基本上客户提供了WSDL文件,我已将其添加为"服务参考"进入我的控制台应用程序。

这是我的配置文件

<bindings>
  <customBinding>
    <binding name="BulkRequestTransmitterBinding"  >
      <binaryMessageEncoding compressionFormat="GZip" />
      <httpsTransport/>
    </binding>
  </customBinding>
</bindings>
<client>
  <endpoint address="MYENDPOINTURL"
      binding="customBinding" 
      bindingConfiguration="BulkRequestTransmitterBinding"
      contract="CONTRACTNAME" 
      name="BulkRequestTransmitterPort" />
</client>

2 个答案:

答案 0 :(得分:3)

首先,您需要下载this sample encoder from Microsoft

进行设置并将其作为项目添加到解决方案中。之后你需要做一些调整。

  1. 首先,您需要将内容类型更改为&#34; text / xml&#34;而不是&#34; application / x-gzip&#34;。通过改变

    class GZipMessageEncoder : MessageEncoder
    {
    static string GZipContentType = "application/x-gzip";
    

    static string GZipContentType = "text/xml";
    
  2. 发送前你还需要更改内容编码标题this blog post describes it in more detail,但代码在这里:

    using (new OperationContextScope(transmitter.InnerChannel))
    {
    // Add a HTTP Header to an outgoing request
    HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
    requestMessage.Headers["Content-Encoding"] = "gzip";
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
    
    var response = transmitter.BulkRequestTransmitter(
        securityHeader,
        security,
        ref businessHeader,
        transmitterManifestReqDtl,
        transmitterType);
    ParseSubmitResponse(response);
    }
    
  3. IRS要求你发送压缩的所有内容,然后以非压缩格式响应(至少发送器部分,谁知道他们决定对状态部分做什么)所以需要禁用解压缩例程,它位于

    ZipEncoder.CZipMessageEncoderFactory.GZipMessageEncoder.DecompressBuffer
    

    您只需要注释掉using语句并交换

    int bytesRead = gzStream.Read(tempBuffer, 0, blockSize);
    

    int bytesRead = memoryStream.Read(tempBuffer, 0, blockSize);
    
  4. 接下来,您需要更改内部邮件编码邮件版本以与IRS兼容。所以在

    GZipEncoder.GZipMessageEncodingElement.ApplyConfiguration
    

    您需要将TextMessageEncodingBindingElement的构造函数更改为:

    binding.InnerMessageEncodingBindingElement =
        new TextMessageEncodingBindingElement(MessageVersion.Soap11WSAddressing10, Encoding.UTF8);
    
  5. 有了这个,你几乎准备好了,你只需要向app.config添加内容你需要添加以下部分(服务模型是标记以供参考哪个部分):

    <system.serviceModel>
      <extensions>
        <bindingElementExtensions>
          <add name="gzipMessageEncoding" type="GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </bindingElementExtensions>
      </extensions>
    
  6. 现在您可以使绑定看起来像这样:

    <binding name="BulkRequestTransmitterBinding">
      <gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />
      <httpsTransport />
    </binding>
    
  7. 这样,您的代码就可以成功传输到IRS。

答案 1 :(得分:0)

就无法简单评论而言,我和你们两个人在同一条船上。关于向国税局传递的重要解释。似乎有一些人在这个网站上为我们各自的实体工作这个相同的项目。

但是,我遇到了以下错误,并且无法确定解决此问题的后续步骤。我在将BulkRequestTransmitterPortTypeClient实例化为新对象时收到此错误,以便我可以将Content-Encoding添加到标头并将请求发送到IRS。

  

System.Configuration.dll中出现未处理的“System.Configuration.ConfigurationErrorsException”类型异常

     

其他信息:无法加载为扩展名“gzipMessageEncoding”注册的“GZipEncoder.GzipMessageEncodingElement,GZipEncoder”类型。

  • 我在我的解决方案中创建了一个新项目,并从Encoding示例中创建了三个类文件。
  • 我对您的代码进行了更改。
  • 在我的客户端应用程序中添加了此项目作为参考。
  • 在我的客户端应用程序中,gzipMessageEncoding app.config条目带有下划线,但是从我读过的其他帖子中,这没关系。
  • 我认为<extensions><bindingElementExtensions>中的相应<metadata><policyImporters><extension>app.config条目符合我的认可。

<强>答-修改
为了克服我遇到的错误,我发现this post导致我使用以下代码输出我需要添加到app.config的类型字符串。我将这些命令输出的字符串复制到app.config中,这让我超越了上面的错误。

Console.WriteLine(typeof(GZipEncoder.GZipMessageEncodingElement).AssemblyQualifiedName);
Console.WriteLine(typeof(GZipEncoder.GZipMessageEncodingBindingElementImporter).AssemblyQualifiedName);

app.config条目

<system.serviceModel>
  <extensions>
    <bindingElementExtensions>
      <add name="gzipMessageEncoding" type="GZipEncoder.GZipMessageEncodingElement, GZipMessageEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </bindingElementExtensions>
  </extensions>
  <client>
    <metadata>
      <policyImporters>
        <extension type="GZipEncoder.GZipMessageEncodingBindingElementImporter, GZipMessageEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </policyImporters>
    </metadata>
  </client>
  <bindings>
    <customBinding>
      <binding name="BulkRequestTransmitterBinding">
        <gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />
        <httpsTransport />
      </binding>
    </customBinding>
  </bindings>
</system.serviceModel>

我仍然在gzipMessageEncoding元素上收到架构验证警告,但我见过很多事情都说应该是这种情况。所以现在,我将忽略它。

请求提交

// Called from the main method.
// 'request' is the BulkRequestTransmitterRequest object where the BusinessHeader, 
// Manifest, Security, and FormData are set.
ACABulkRequestTransmitterResponseType response = SubmitRequest(request).ACABulkRequestTransmitterResponse;

private static BulkRequestTransmitterResponse SubmitRequest(BulkRequestTransmitterRequest request)
{
    // Create a new instance of the Web Service client object.
    BulkRequestTransmitterPortTypeClient client = new BulkRequestTransmitterPortTypeClient("BulkRequestTransmitterPort");

    using (new OperationContextScope(client.InnerChannel))
    {
        // Add a HTTP Header to an outgoing requqest.
        HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();

        requestMessage.Headers["Content-Encoding"] = "gzip";
                            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;

        return client.BulkRequestTransmitter(request);
    }
}

接下来我在TransmitterRequestStatusRequest收到的下一个错误:

  

其他信息:邮件中的WS安全标头无效。