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他们可以提供,因为这已经开始了!
我遇到了同样的问题,我找到的最终解决方案是通过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边界分隔的末尾附加的文件的原始二进制数据
我认为你可能有几个选择:
1) 使用MTOM。这似乎会自动将外发消息包装在 MIME 块中。
2)微软实际上是通过XopDocument类提供了用mime生成和读取XOP的支持,SoapEnvelope就是从这个类继承而来的。
保存方法是SaveToXopPackage,读取方法是LoadFromXopPackage。
但是,我认为这种方法可能需要您自己通过 HttpWebRequest 执行消息的发送。这个博客有一个如何实现这个的例子。缺点是这需要大量额外的代码和配置才能正常工作。
理想的解决方案是拦截执行包络传输的代码,但我一直无法在管道中找到正确的位置。
| 归档时间: |
|
| 查看次数: |
20267 次 |
| 最近记录: |