我在使用客户端网络服务时遇到以下错误。
错误:响应消息的内容类型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>
答案 0 :(得分:3)
首先,您需要下载this sample encoder from Microsoft
进行设置并将其作为项目添加到解决方案中。之后你需要做一些调整。
首先,您需要将内容类型更改为&#34; text / xml&#34;而不是&#34; application / x-gzip&#34;。通过改变
class GZipMessageEncoder : MessageEncoder
{
static string GZipContentType = "application/x-gzip";
到
static string GZipContentType = "text/xml";
发送前你还需要更改内容编码标题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);
}
IRS要求你发送压缩的所有内容,然后以非压缩格式响应(至少发送器部分,谁知道他们决定对状态部分做什么)所以需要禁用解压缩例程,它位于
ZipEncoder.CZipMessageEncoderFactory.GZipMessageEncoder.DecompressBuffer
您只需要注释掉using语句并交换
int bytesRead = gzStream.Read(tempBuffer, 0, blockSize);
与
int bytesRead = memoryStream.Read(tempBuffer, 0, blockSize);
接下来,您需要更改内部邮件编码邮件版本以与IRS兼容。所以在
GZipEncoder.GZipMessageEncodingElement.ApplyConfiguration
您需要将TextMessageEncodingBindingElement的构造函数更改为:
binding.InnerMessageEncodingBindingElement =
new TextMessageEncodingBindingElement(MessageVersion.Soap11WSAddressing10, Encoding.UTF8);
有了这个,你几乎准备好了,你只需要向app.config添加内容你需要添加以下部分(服务模型是标记以供参考哪个部分):
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
现在您可以使绑定看起来像这样:
<binding name="BulkRequestTransmitterBinding">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />
<httpsTransport />
</binding>
这样,您的代码就可以成功传输到IRS。
答案 1 :(得分:0)
就无法简单评论而言,我和你们两个人在同一条船上。关于向国税局传递的重要解释。似乎有一些人在这个网站上为我们各自的实体工作这个相同的项目。
但是,我遇到了以下错误,并且无法确定解决此问题的后续步骤。我在将BulkRequestTransmitterPortTypeClient
实例化为新对象时收到此错误,以便我可以将Content-Encoding
添加到标头并将请求发送到IRS。
System.Configuration.dll中出现未处理的“System.Configuration.ConfigurationErrorsException”类型异常
其他信息:无法加载为扩展名“gzipMessageEncoding”注册的“GZipEncoder.GzipMessageEncodingElement,GZipEncoder”类型。
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);
}
}
接下来我在TransmitterRequest
和StatusRequest
收到的下一个错误:
其他信息:邮件中的WS安全标头无效。