【发布时间】:2012-01-24 09:16:32
【问题描述】:
我对如何在我的 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>
这是我们可以生成和发送的 XML 部分,但是它是不正确的,因为我们需要一个 MIME 部分,例如:
在 XML 之前:
--MIMEBoundary
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <rootpart>
在 XML 之后
--MIMEBoundary
Content-Type: image/gif; name=test.gif
Content-Transfer-Encoding: binary
Content-ID: <test.gif>
GIF89a@�
--MIMEBoundary--
我已经在互联网上搜索了答案,但一无所获。似乎没有太多关于为此使用 WSE 的文档。我必须强调,WSE 是服务器端的要求,我无法改变技术来解决这个问题。
有没有办法可以添加这些 MIME 部分?
编辑:我必须补充一点,我可以通过 SoapUI 发送带有附件的工作 XML 文档,但似乎无法在我们的代码中找到方法。
我已经添加了一个赏金来尝试解决这个问题。如果有人有任何其他想法,请告诉我。
再次编辑:我知道我已经有一个星期没有在这里查看回复了,但是虽然有些人给出了一个好主意,但我仍然在画一个空白。围绕XopDocument 及其方法的糟糕文档是一个很大的症结所在,如果有人有任何使用SaveToXopPackage 的例子,请他们提供,因为这已经开始令人讨厌了!
【问题讨论】:
-
WSE 已过时,无论如何都不应使用。
-
好吧,约翰,想出一个解决方案,而不是四处走动,假装你什么都知道。在这种情况下,对我来说,WSE 是必需的。没有它,我们的请求将被拒绝。我无法告诉第三方供应商他们应该如何编码,我可以尝试,但他们一直是世界上最没有帮助的公司。因此,如果您正在创建自己的软件,则不应使用 WSE,但在这种情况下它是必需的。
-
很明显,您的公司是否应该继续与要求您使用过时软件的第三方开展业务,而不是某些不使用过时软件的竞争对手,这是一个商业决策。
-
很明显,但是当它是一家比我们大得多的公司时,我们非常依赖大量收入,对此我们无能为力。如何看待这种工作关系的一个例子,假设我们是一家小型体育用品连锁店,阿迪达斯希望我们这样做,我们不能只是告诉他们我们没有使用 WSE 并从我们的商店中删除该品牌。我们不是运动商店,他们也不是阿迪达斯,但情况非常相似。这不像不使用 WSE 那样简单......
-
我对此没什么好说的,只是希望有人告诉皇帝他的衣服已经过时了。此外,如果您假装不使用 WSE,那么您无疑将学习如何自定义 WCF 以完成您需要的工作,只需使用受支持的软件。
标签: .net soap attachment mtom wse