使用MTOM和内容传输编码通过WCF发送SOAP消息:7位

使用MTOM和内容传输编码通过WCF发送SOAP消息:7位,wcf,soap,mtom,7-bit,irs,Wcf,Soap,Mtom,7 Bit,Irs,我正试图通过WCF向IRS发送SOAP消息,但由于我的MTOM附件格式不正确,消息一直被拒绝 我已将问题缩小到我的内容传输编码值。它被设置为二进制(8位的缩写) IRS服务希望我使用7位,带有8位编码的附件(换句话说,使用UTF-8编码,然后保证我没有使用任何非ASCII字符) 我已经在使用一个定制的消息编码器来gzip我的请求(响应返回纯文本,啊)。这就是我的WriteMessage现在的样子 public override ArraySegment<byte> WriteMess

我正试图通过WCF向IRS发送SOAP消息,但由于我的MTOM附件格式不正确,消息一直被拒绝

我已将问题缩小到我的
内容传输编码
值。它被设置为
二进制
(8位
的缩写)

IRS服务希望我使用
7位
,带有8位编码的附件(换句话说,使用UTF-8编码,然后保证我没有使用任何非ASCII字符)

我已经在使用一个定制的消息编码器来gzip我的请求(响应返回纯文本,啊)。这就是我的
WriteMessage
现在的样子

public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) {
    // get an instance of the underlying encoder
    var encoder = new MtomMessageEncodingBindingElement() {
            MessageVersion = MessageVersion.Soap11WSAddressing10,
            WriteEncoding = System.Text.Encoding.UTF8
        }.CreateMessageEncoderFactory().Encoder;

    // write the message contents
    var uncompressed = encoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);

    // compresses the resulting byte array
    return CompressBuffer(uncompressed, bufferManager, messageOffset);
}
public-override-ArraySegment-WriteMessage(消息消息消息、int-maxMessageSize、BufferManager-BufferManager、int-messageOffset){
//获取底层编码器的实例
var编码器=新的MtomMessageEncodingBindingElement(){
MessageVersion=MessageVersion.Soap11WSAddressing10,
WriteEncoding=System.Text.Encoding.UTF8
}.CreateMessageEncoderFactory().Encoder;
//写下消息内容
var uncompressed=encoder.WriteMessage(message、maxMessageSize、bufferManager、messageOffset);
//压缩生成的字节数组
返回CompressBuffer(未压缩、bufferManager、messageOffset);
}

有什么想法吗?当我将
WriteEncoding
属性更改为ASCII或UTF7时。NET抛出ArgumentException并告诉我该格式不受支持。

我使用Java Apache CXF和WSS4J作为IRS解决方案,但如果您遇到此错误“邮件格式不正确和/或无法解释。请查看位于的AIR提交合成和参考指南第3节中概述的XML标准,纠正任何问题,然后重试。“这是因为IRS希望:

Content-Type: application/xml
Content-Transfer-Encoding: 7bit
Content-ID: <6920edd2-a3c7-463b-b336-323a422041d4-1@blahurn:us:gov:treasury:irs:common>
Content-Disposition: attachment;name="1094B_Request_BBBBB_20151019T121002000Z.xml" 
内容类型:应用程序/xml
内容传输编码:7bit
内容ID:
内容处置:附件;name=“1094B_Request_uubbbbb_20151019T1210020000z.xml”

我正在使用Java Apache CXF和WSS4J作为IRS解决方案,但如果您遇到此错误,“消息格式不正确和/或无法解释。”。请查看位于的AIR提交合成和参考指南第3节中概述的XML标准,纠正任何问题,然后重试。“这是因为IRS希望:

Content-Type: application/xml
Content-Transfer-Encoding: 7bit
Content-ID: <6920edd2-a3c7-463b-b336-323a422041d4-1@blahurn:us:gov:treasury:irs:common>
Content-Disposition: attachment;name="1094B_Request_BBBBB_20151019T121002000Z.xml" 
内容类型:应用程序/xml
内容传输编码:7bit
内容ID:
内容处置:附件;name=“1094B_Request_uubbbbb_20151019T1210020000z.xml”

WCF中的内置MTOM编码器似乎不会对与IRS服务兼容的请求进行编码。它会对请求中发现的任何base64编码的内容进行编码,包括签名请求中的BinarySecurityToken。我可以通过创建自定义编码器使请求更接近IRS要求。在WriteMessage中,您可以追加MIME分隔符并将其前置,然后将文件重新编码为附件。需要传出消息检查器来正确设置标题:

WCF中的内置MTOM编码器似乎不会对与IRS服务兼容的请求进行编码。它会对请求中发现的任何base64编码的内容进行编码,包括BinarySecuri签名请求中的tyToken。通过创建自定义编码器,我可以获得更接近IRS要求的请求。在WriteMessage中,您可以附加和前置MIME分隔符,并将文件重新编码为附件。需要传出消息检查器来正确设置标题:

我认为8位编码问题较少除了MTOM试图对WSS安全头进行编码(这导致证书优化到MTOM附件中)这一事实之外,还有更多的研究。这是由WCF在我无法控制的情况下完成的,因此我正在考虑编写一个自定义消息编码器来克服它。希望在我深入了解之前,这里的人能给我一个更好的答案,如果它存在的话:)我认为经过更多的研究后,8位编码并不是一个问题,而不是MTOM试图编码WSS安全性的事实标头(导致证书优化为MTOM附件)。这是由WCF在我无法控制的情况下完成的,因此我正在考虑编写一个自定义消息编码器来克服它。希望在我深入之前,这里的人能给我一个更好的答案(如果存在):)我相信你是对的。我采取了一种稍微不同的方法,只是颠倒了MTOM编码结果中我不想要的部分.目前我仍在努力使请求被接受,但国税局无法使用我的原始请求重现我现在收到的错误。我今天与他们安排了一个电话,以了解问题所在(希望如此)。感谢您的参与!如果我使用的当前解决方案不起作用,我将尝试您的方法。非常有兴趣知道您是否在使用C#时获得了此功能。我非常熟悉自定义mtom编码方法,但现在在解析请求时收到错误消息:TPE1106发现以元素“签名”开头的无效内容。没有子元素元素,因为唯一的签名元素在安全令牌中,并且安全性已经过验证,所以我假设IRS开始通过信封头进行解析。可能是因为.NET安全头没有wsse命名空间,它抛出了此错误。我让MTOM工作了(必须真正破解WCF才能使其正常工作),现在我的安全头无效,因为我在MTOM编码后对消息所做的操作。我将在我(重新)修改后的几个小时内报告实现邮件的手动签名。整个.Net社区似乎在同一时间开始汇聚到这些解决方案上。看到这些更新非常有趣:)我相信你是对的。我采取了一种稍微不同的方法和JU