添加SOAP请求的附件

ano*_*ery 5 .net soap wse mtom attachment

关于如何在SOAP请求中添加附件,我处于松散状态.我们必须使用java内置的第三方Web服务,这是我遇到的最复杂的事情.我们使用的任何其他Web服务(需要附件)都有方法或属性来添加附件.简单.但是,这个没有提供这样的方法.

我们一起得到了一个SOAP消息的版本,这与我们想要的XML完全一样,但它是我们无法添加的文件的MIME部分.

例:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<soap:Header>
<payloadManifest xmlns="http://<examplePayload>">
<manifest contentID="Content0" namespaceURI="http://<exampleManifest>" element="ProcessRepairOrder" version="2.01" />
</payloadManifest>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2011-12-19T15:25:13Z</wsu:Created>
<wsu:Expires>2011-12-19T15:30:00Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken><wsse:Username>username</wsse:Username><wsse:Password>password</wsse:Password></wsse:UsernameToken></wsse:Security></soap:Header><soap:Body><ProcessMessage xmlns="<examplePayload"><payload><content id="Content0">

<s:ProcessRepairOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.xsd" xmlns:s="http://<exampleManifest>" xmlns:gwm="http://example">
    <s:ApplicationArea>
        <s:Sender>
            <s:Component>Test</s:Component>
            <s:Task>ProcessAttachment</s:Task>
            <s:CreatorNameCode>Test</s:CreatorNameCode>
            <s:SenderNameCode>XX</s:SenderNameCode>
            <s:DealerNumber>111111</s:DealerNumber>
            <s:DealerCountry>GB</s:DealerCountry>
        </s:Sender>
        <s:CreationDateTime>2010-03-26T13:37:05Z</s:CreationDateTime>
        <s:Destination>
            <s:DestinationNameCode>GM</s:DestinationNameCode>
            <s:DestinationURI/>
            <s:DestinationSoftwareCode>GWM</s:DestinationSoftwareCode>
        </s:Destination>
    </s:ApplicationArea>
    <s:DataArea xsi:type="gwm:DataAreaExtended">
        <s:Process/>
        <s:RepairOrder>
            <s:Header xsi:type="gwm:RepairOrderHeaderExtended">
                <s:DocumentId/>
            </s:Header>
            <s:Job xsi:type="gwm:JobExtended">
                <s:JobNumber/>
                <s:OperationId>Test</s:OperationId>
                <s:OperationName/>
                <s:CodesAndComments/>
                <s:Diagnostics/>
                <s:WarrantyClaim xsi:type="gwm:WarrantyClaimExtended">
                    <s:OEMClaimNumber>00112233445566778899</s:OEMClaimNumber>
                    <gwm:Attachment>
                        <gwm:File><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:test.gif"/></gwm:File>
                        <gwm:Filename>test.gif</gwm:Filename>
                    </gwm:Attachment>
                </s:WarrantyClaim>
                <s:LaborActualHours>0.0</s:LaborActualHours>
                <s:Technician/>
            </s:Job>
        </s:RepairOrder>
    </s:DataArea>
</s:ProcessRepairOrder>
</content></payload></ProcessMessage></soap:Body></soap:Envelope>
Run Code Online (Sandbox Code Playgroud)

这是我们可以生成和发送的XML部分,但它不正确,因为我们需要一个MIME部分,如:

在XML之前:

--MIMEBoundary
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <rootpart>
Run Code Online (Sandbox Code Playgroud)

在XML之后

--MIMEBoundary
Content-Type: image/gif; name=test.gif
Content-Transfer-Encoding: binary
Content-ID: <test.gif>
GIF89a@?

--MIMEBoundary--
Run Code Online (Sandbox Code Playgroud)

我已经在互联网上搜索了答案但是空白了.关于使用WSE,似乎没有太多关于此的文档.我必须强调WSE是服务器端的要求,我无法改变技术来解决这个问题.

有没有办法添加这些MIME部分?

编辑:我必须补充一点,我可以通过带有附件的SoapUI发送一个可用的XML文档,但似乎无法在我们的代码中找到方法.

我已经添加了一笔赏金来试图解决这个问题.如果有人有任何其他想法,请告诉我.

再次编辑:我知道已经过了一周,因为我能够在这里查看回复,但有些人给出了一个好主意,在哪里看,我仍然在画一个空白.围绕着可怕的文档XopDocument及其方法是一个很大的问题,如果有人有任何使用的例子,SaveToXopPackage他们可以提供,因为这已经开始了!

kts*_*com 8

我遇到了同样的问题,我找到的最终解决方案是通过HttpWebRequest.示例代码:

    public string ProcessAttachment(string fileInput)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Settings.Default.GWM_WS_WebReference_GWM);
        req.Headers.Add("SOAPAction", "\"http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment\"");
        req.Headers.Add("Accept-Encoding", "gzip,deflate");
        req.ContentType = "multipart/related; type=\"application/xop+xml\"; start=\"<rootpart@soapui.org>\"; start-info=\"text/xml\"; boundary=\"----=_Part_14_1350106.1324254402199\"";
        req.Method = "POST";
        req.UserAgent = "Jakarta Commons-HttpClient/3.1";
        req.Headers.Add("MIME-Version", "1.0");
        System.Net.ServicePointManager.Expect100Continue = false;
        Stream memStream = new System.IO.MemoryStream();
        FileStream fileStream = new FileStream(fileInput, FileMode.Open, FileAccess.Read);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            memStream.Write(buffer, 0, bytesRead);
        }
        fileStream.Close();
        Stream stm = req.GetRequestStream();
        memStream.Position = 0;
        byte[] tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();
        stm.Write(tempBuffer, 0, tempBuffer.Length);
        stm.Close();
        HttpWebResponse resp = null;
        resp = (HttpWebResponse)req.GetResponse();
        stm = resp.GetResponseStream();
        StreamReader r = new StreamReader(stm);
        return r.ReadToEnd();            
    }
Run Code Online (Sandbox Code Playgroud)

参数fileInput是包含SOAP请求的文件的绝对路径,该SOAP请求还包含要在MIME边界分隔的末尾附加的文件的原始二进制数据


com*_*ech 5

我认为你可能有几个选择:

1) 使用MTOM。这似乎会自动将外发消息包装在 MIME 块中。

2)微软实际上是通过XopDocument类提供了用mime生成和读取XOP的支持,SoapEnvelope就是从这个类继承而来的。

保存方法是SaveToXopPackage,读取方法是LoadFromXopPackage

但是,我认为这种方法可能需要您自己通过 HttpWebRequest 执行消息的发送。这个博客有一个如何实现这个的例子。缺点是这需要大量额外的代码和配置才能正常工作。

理想的解决方案是拦截执行包络传输的代码,但我一直无法在管道中找到正确的位置。