在使用客户端 Web 服务时出现内容错误

本文关键字:容错 错误 服务 客户端 Web | 更新日期: 2023-09-27 18:32:39

我在使用客户端 Web 服务时收到以下错误。

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

响应的前 807 个字节是:

' soapenv:client 请求消息必须使用 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.Web异常:远程服务器返回错误:(500( 内部服务器错误。 at 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>

在使用客户端 Web 服务时出现内容错误

首先,您需要从Microsoft下载此示例编码器

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

  1. 首先,您需要将内容类型更改为"text/xml"而不是"application/x-gzip"。

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

    static string GZipContentType = "text/xml";
    
  2. 在传输之前,您还需要更改内容编码标头,这篇博文更详细地描述了它,但代码在这里:

    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. 国税局在要求您发送压缩后的所有内容的同时,以未压缩的格式(至少对发射器部分,谁知道他们决定对状态部分做什么(进行响应,因此需要禁用解压缩例程,它位于

    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>
    

这样,您的代码应该会成功传输到 IRS。

在无法简单地评论方面,我和你们俩都在同一条船上。 关于向国税局传输的精彩解释。 似乎我们中的一些人在这个网站上为我们各自的实体从事同一个项目。

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

系统配置

中发生类型为"系统配置.配置错误异常"的未处理异常.dll

附加信息:无法加载为扩展"gzipMessageEncoding"注册的类型"GZipEncoder.GzipMessageEncodingElement, GZipEncoder"。

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

答案编辑
为了克服我遇到的错误,我找到了这篇文章,这导致我使用以下代码来输出我需要添加到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 安全标头无效。