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



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

我已经将问题缩小到我的Content-Transfer-Encoding值。它设置为 Binary8-bit 的简写)。

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

我已经在使用自定义消息编码器来压缩我的请求(响应返回纯文本,呃)。这就是我现在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);
}

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

WCF 中内置的 MTOM 编码器似乎不会对与 IRS 服务兼容的请求进行编码。它对在 base64 编码的请求中找到的任何内容进行编码,包括签名请求中的 BinarySecurityToken。通过创建自定义编码器,我能够使请求更接近 IRS 要求。在 WriteMessage 中,可以追加和预置 MIME 分隔符,并将文件重新编码为附件。需要传出邮件检查器才能正确设置标头:https://blogs.msdn.microsoft.com/carlosfigueira/2011/04/18/wcf-extensibility-message-inspectors/

我正在使用Java Apache CXF和WSS4J作为IRS解决方案,但是如果您收到此错误"消息格式不正确和/或无法解释。请查看位于 https://www.irs.gov/for-Tax-Pros/Software-Developers/Information-Returns/Affordable-Care-Act-Information-Return-AIR-Program 的 AIR 提交组成和参考指南第 3 节中概述的 XML 标准,更正任何问题,然后重试。 这是因为美国国税局期待这一点:

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" 

最新更新