2011-12-20 39 views
5

Tôi sắp hết hạn cách thêm phần đính kèm vào yêu cầu SOAP của mình. Chúng ta phải tiêu thụ một dịch vụ web bên thứ ba, được xây dựng bằng java, đó là điều phức tạp nhất mà tôi từng gặp. Bất kỳ dịch vụ web nào khác mà chúng tôi đã sử dụng, đều yêu cầu tệp đính kèm, có phương thức hoặc thuộc tính để thêm tệp đính kèm. Đơn giản. Tuy nhiên, điều này không cung cấp phương pháp như vậy.Thêm phần đính kèm vào yêu cầu SOAP

Chúng tôi đã nhận được một phiên bản của thông điệp SOAP với nhau chính xác như chúng tôi muốn XML, tuy nhiên nó là phần MIME của tệp mà chúng tôi không thể thêm.

Ví dụ:

<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> 

Đây là phần XML mà chúng ta có thể tạo ra và gửi đi, tuy nhiên nó là không chính xác như chúng ta cần một phần MIME trong đó như:

Trước XML:

--MIMEBoundary 
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <rootpart> 

Sau XML

--MIMEBoundary 
Content-Type: image/gif; name=test.gif 
Content-Transfer-Encoding: binary 
Content-ID: <test.gif> 
[email protected]� 

--MIMEBoundary-- 

Tôi đã lùng sục Internet để tìm câu trả lời nhưng đã bỏ trống. Dường như không có nhiều tài liệu về việc sử dụng WSE cho việc này. Tôi phải nhấn mạnh rằng WSE là một yêu cầu ở phía máy chủ, và không có cách nào tôi có thể thay đổi công nghệ để giải quyết vấn đề này.

Có cách nào để thêm các phần MIME này không?

EDIT: Tôi phải thêm rằng tôi có thể nhận được một tài liệu XML đang hoạt động được gửi qua SoapUI với các tệp đính kèm, nhưng dường như không tìm được cách nào trong mã của chúng tôi.

Tôi đã thêm tiền thưởng để thử và nhận giải pháp cho vấn đề này. Nếu bất cứ ai có bất kỳ ý tưởng khác xin vui lòng cho tôi biết.

CHỈNH SỬA lại: Tôi biết đã một tuần kể từ khi tôi có thể kiểm tra câu trả lời ở đây, nhưng trong khi một số cho ý tưởng hay là tôi vẫn đang vẽ trống. Các tài liệu khủng khiếp xung quanh XopDocument và phương pháp của nó là một điểm gắn bó lớn, nếu bất cứ ai có bất kỳ ví dụ về việc sử dụng SaveToXopPackage họ có thể vui lòng cung cấp bởi vì điều này đang bắt đầu để grate!

+2

WSE đã lỗi thời và không nên sử dụng cho dù là gì. –

+1

Vâng John, làm thế nào về đến với một giải pháp thay vì đi xung quanh chỉ giả vờ bạn biết tất cả mọi thứ. Trong kịch bản này, đối với tôi, WSE IS là bắt buộc. Nếu không có nó, yêu cầu của chúng tôi sẽ bị từ chối. Tôi không thể nói với nhà cung cấp bên thứ ba cách họ nên viết mã, tôi có thể thử nhưng họ luôn là công ty hữu ích nhất trên thế giới để làm việc. Vì vậy, trong khi WSE không nên được sử dụng nếu bạn đang tạo ra phần mềm của riêng bạn, nó là một yêu cầu trong trường hợp này. – anothershrubery

+0

Rõ ràng đó là quyết định kinh doanh về việc liệu công ty của bạn có nên tiếp tục kinh doanh với bên thứ ba yêu cầu bạn sử dụng phần mềm lỗi thời hay không, so với một số đối thủ không có. –

Trả lời

6

Tôi đang đối mặt với cùng một vấn đề và giải pháp cuối cùng tôi tìm thấy là thông qua HttpWebRequest. Một mã mẫu:

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=\"<[email protected]>\"; 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();    
    } 

Tham số fileInput là đường dẫn tuyệt đối của tập tin có chứa các yêu cầu SOAP chứa cũng là dữ liệu nhị phân thô của tập tin được đính kèm ở cuối tách với MIME Boundary

+3

-1 không sử dụng "khối". –

+0

Tôi không thực sự hiểu cách hoạt động của nó. Nếu bạn đang nói bao gồm dữ liệu thô trong tệp nội tuyến, thì điều đó là không thể, trong trường hợp của tôi. Nó phải được chứa trong một phần XOP như được định nghĩa trong ví dụ tôi đã đưa ra. Nếu tôi thiếu điều này trong mã của bạn, vui lòng thông báo. – anothershrubery

+0

Tệp phải có 2 phần mà bạn mô tả trong bài đăng đầu tiên: Phần XML và phần dữ liệu Ras được phân tách bằng Ranh giới Mime. Phần dữ liệu thô có nghĩa là phần "GIF89a @ " của bạn nên được thay thế bằng chuỗi đơn giản bằng cách sử dụng mã sau: byte [] bt = File.ReadAllBytes (imageFile); string raw = System.Text.Encoding.Unicode.GetString (bt) ; Tốt hơn liên hệ trực tiếp với tôi để giải thích, vì tôi nghĩ rằng điều này vượt quá phạm vi stackoverflow. –

3

Tôi nghĩ rằng bạn có thể có một vài tùy chọn:

1) Sử dụng MTOM. Điều này dường như tự động bao bọc tin nhắn gửi đi trong các khối MIME.

2) Microsoft thực sự cung cấp hỗ trợ tạo và đọc XOP với mime thông qua lớp XopDocument, đó là những gì SoapEnvelope kế thừa từ đó.

Phương thức lưu là SaveToXopPackage và phương pháp đọc là LoadFromXopPackage.

Tuy nhiên, tôi nghĩ rằng cách tiếp cận này có thể yêu cầu bạn tự thực hiện việc gửi thư thông qua HttpWebRequest. This blog có một ví dụ về cách thực hiện điều này. Nhược điểm là điều này đòi hỏi rất nhiều mã và cấu hình bổ sung để hoạt động chính xác.

Giải pháp lý tưởng là chặn mã thực hiện quá trình truyền phong bì, nhưng tôi không thể xác định được vị trí chính xác cho điều này trong đường ống.

+0

Đây chỉ là một vài số lượng tài liệu tham khảo tôi đã sử dụng khi cố gắng làm cho tài liệu này hoạt động. Tôi có thể nhận được nó để gửi một khối MIME kèm theo, nhưng tôi không biết làm thế nào để thêm dữ liệu nhị phân của tập tin đính kèm vào phần MIME. – anothershrubery

+1

Ngoài ra, cũng có thể không có tài liệu cho 'SaveToXopPackage', Google trả lại 28 kết quả cho nó, phần lớn trong số đó là trang chính xác này! – anothershrubery

1

Như bạn nói bạn đã làm việc đó thông qua SoapUI, tôi nghĩ bạn có thể hỏi SoapUI cho XML được tạo ra để bạn biết nó trông như thế nào, sau đó sửa đổi mã của bạn để bắt chước.

CẬP NHẬT: sau khi nhận xét của bạn và đọc các câu trả lời khác chi tiết hơn: giải pháp nhìn tôi chỉ gửi byte trực tiếp, sử dụng HttpWebRequest như trong câu trả lời của ktsiolis. Cụ thể:

  • Tạo SOAP XML của bạn (ví dụ bạn đưa ra), mã hóa này để byte trong UTF8 (1)
  • Tạo một chuỗi với mimeboundary ban đầu (một phần trong bạn "Trước XML"), mã hóa thành byte trong UTF8 (2)
  • Tạo các byte cho mimeboundary thứ hai (phần trong "sau XML"). Vì vậy, hãy tạo chuỗi chứa "--MIMEBOUNDARY" v.v., mã hóa thành byte UTF8 và nối thêm tất cả byte của tệp test.gif của bạn (3)
  • Nối tất cả byte theo thứ tự (2), (1) và (3) và gửi qua dây.

Không nên làm điều này?

+0

Nghiêm túc? Tôi biết chính xác nó trông như thế nào, tôi chỉ không biết làm thế nào tôi có thể nhận được dữ liệu nhị phân gắn liền với phần MIME. – anothershrubery

2

Tôi tin tưởng 90% tôi đang làm việc trên cùng một dự án giống như các bạn. Yêu cầu xà phòng đó hơi quá quen thuộc :-)

Chúng tôi đã tận dụng tối đa bằng cách chuyển sang WCF và về cơ bản mã hóa đối tượng yêu cầu (tạo các lớp khớp với định dạng xà phòng và sau đó sử dụng thuộc tính xmlelement để trang trí nó để nó trông giống như yêu cầu xà phòng của họ. Bản thân tệp được khai báo là một Byte() trên lớp Đính kèm và cũng được trang trí với xmlelement).

Đây là hợp đồng WCF và một phần của mô hình dữ liệu. Mô hình dữ liệu thực tế có một loạt các lớp phụ (Khu vực ứng dụng, Khu vực dữ liệu, Công việc, v.v.) nhưng điều này cho bạn đủ cảm giác về cấu trúc của nó. Phần quan trọng là File as Byte(). Đây là trong Vb.net ...

Public Class WarrantyClaim 
    <XmlElement(Order:=0)> Public OEMClaimNumber As String = "" 
    <XmlElement(Order:=1, namespace:="http://www.gm.com/2006/GWM")> Public Attachment As New Attachment 
End Class 

Public Class Attachment 
    <XmlElement(Order:=0)> Public File As Byte() 
    <XmlElement(Order:=1)> Public Filename As String 
End Class 

<ServiceContract(XmlSerializerFormat()> _ 
Public Interface IService 
    <OperationContract(action:="http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment")> _ 
    Sub ProcessMessage(ByVal payload As WarrantyClaim) 
End Interface 

Tiếp theo bạn đã có WCF khách hàng của bạn, điều này là khá nhiều giống như tất cả các khách hàng WCF.

Public Class GmgwClient 
    Inherits System.ServiceModel.ClientBase(Of IService) 
    Implements IService 

    Public Sub New() 
     MyBase.New() 
    End Sub 
    Public Sub New(ByVal configName As String) 
     MyBase.New(configName) 
    End Sub 
    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress) 
     MyBase.New(binding, remoteAddress) 
    End Sub 

    Public Sub ProcessMessage(ByVal payload As Payload) Implements IService.ProcessMessage 
     MyBase.Channel.ProcessMessage(payload) 
    End Sub 
End Class 

Cuối cùng bạn đã có app.config. Đây là phép thuật bởi vì chúng tôi đang yêu cầu WCF sử dụng Mtom để gửi tin nhắn. Điều này sẽ lấy Byte() và tách nó ra thành một phần MIME riêng biệt thay thế nó bằng một XOP: Include. Lưu ý rằng bây giờ tôi chỉ gửi nó qua localhost để tôi có thể thấy yêu cầu bằng tcpTrace. Bạn có thể google ứng dụng đó nhưng nó về cơ bản sẽ nắm bắt được yêu cầu để chúng ta có thể thấy nó trông như thế nào. Tôi thiết lập tcpTrace để nghe trên cổng 84.

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WsHttpMtomBinding" messageEncoding="Mtom"> 
     <security mode="None"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /> 
     </security> 
     <reliableSession enabled="false" /> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="http://localhost:84/ProcessMessage" binding="wsHttpBinding" bindingConfiguration="WsHttpMtomBinding" contract="MyAppNameSpace.IService" name="preprod"/> 
    </client> 
</system.serviceModel> 

Cuối cùng, đây là cuộc gọi thực tế đến máy khách WCF để đưa ra yêu cầu.

Dim x As New WarrantyClaim 
x.OEmClaimNumber = "12345" 
x.Attachment = New Attachment 
x.Attachment.Filename = "sample.gif" 
x.Attachment.File = IO.File.ReadAllBytes("C:\sample.gif") 

Dim y As New GmgwClient("preprod") 
y.ProcessMessage(x) 

Và đây là dấu vết chúng tôi nhận được thông qua tcpTrace. Nó có cấu trúc cơ bản đúng và nó được quản lý để kéo dữ liệu nhị phân ra khỏi xml và đặt nó vào một phần MIME riêng biệt.

POST /ProcessMessage HTTP/1.1 
MIME-Version: 1.0 
Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1";start-info="application/soap+xml" 
VsDebuggerCausalityData: uIDPoysDMCv023ZIjK0Cpp504ooAAAAA//jfaCaohkab2Zx/EU7gpLZDcUldWtlGr1j4ZnrfKl4ACQAA 
Host: localhost:84 
Content-Length: 55125 
Expect: 100-continue 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 


--uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1 
Content-ID: <http://tempuri.org/0> 
Content-Transfer-Encoding: 8bit 
Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml" 

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment</a:Action> 
    <a:MessageID>urn:uuid:a85374e6-c8ca-4328-ad32-6e8b88a5ca59</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">http://localhost:84/ProcessMessage</a:To> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport"> 
     <payload xsi:type="gwm:WarrantyClaimExtended"> 
     <OEMClaimNumber>12345</OEMClaimNumber> 
     <Attachment xmlns="http://www.gm.com/2006/GWM"> 
      <File> 
      <xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634618782531246992" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> 
      </File> 
      <Filename>sample.gif</Filename> 
     </Attachment> 
     </payload> 
    </ProcessMessage> 
    </s:Body> 
</s:Envelope> 
--uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1 
Content-ID: <http://tempuri.org/1/634618782531246992> 
Content-Transfer-Encoding: binary 
Content-Type: application/octet-stream 

GIF89a<BinaryStuff> 

Như tôi đã đề cập trước đó - chúng tôi vẫn gặp một số vấn đề. Có một số thẻ bị thiếu trong Soap Header ... nhưng tôi nghĩ chúng ta sẽ có thể tìm ra các thẻ đó. Vấn đề thực sự là Content-ID KHÔNG ở định dạng mà đối tác của chúng tôi có thể chấp nhận - họ mong đợi một cái gì đó như < [email protected]> và .net đang định dạng chúng là http://tempuri.org/1/634618782531246992. Điều này làm cho trình xử lý Dịch vụ Web của họ gặp sự cố do không biết cách đọc nội dung của id bên trong thông điệp xà phòng.

+0

Địa chỉ email của tôi có thể được nhìn thấy trong hồ sơ của tôi. – anothershrubery

+0

Chỉ cần chú ý chỉnh sửa của bạn cho điều này ngay bây giờ. Yeah nó trông giống như dự án giống hệt nhau! Thật không may giải pháp của bạn sẽ không hoạt động trong trường hợp của chúng tôi vì chúng tôi bị hạn chế sử dụng WSE chứ không phải WCF ... Reliance on VS 2005. Đó là một nỗi đau. Nhưng đây là kết quả tôi đang tìm kiếm nhưng cần phải tìm ra giải pháp trong WSE. :(Tuy nhiên, với vấn đề của bạn, bạn có thể không đặt Content-ID thành bất cứ điều gì bạn muốn? Điều này làm việc trong SoapUI, khi bạn chỉ định ID nội dung và không dựa vào biểu diễn mặc định? – anothershrubery

0

Ok vì vậy tôi đã chấp nhận dữ liệu từ tệp trong phần tử <gwm:File>. Đây là mà không sử dụng XOP, vì vậy yêu cầu bây giờ trông giống như:

<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>[email protected]�</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> 

Khi truyền vào soapUI này hoạt động hoàn hảo, tuy nhiên trong mã nó cung cấp cho một phản ứng, nhưng nó ném một lỗi nói Response is not well-formed XML. với một ngoại lệ bên trong của WSE1608: No XOP parts were located in the stream for the specified content-id: <rootpart*36875c60-630[email protected]>

Tôi sẽ mở một câu hỏi mới liên quan đến vấn đề này vì đây là vấn đề khác về mặt kỹ thuật.

Câu hỏi khác có thể được tìm thấy tại Soap response, not well formed XML, no XOP parts located, using WSE

0

Tôi tham gia vào chính xác cùng một dự án và tôi có vấn đề tương tự như đã thảo luận trong chủ đề này! Tôi đang sử dụng vb 2005 và WSE 3.0 cải tiến và tôi đã nhận nó làm việc ngay cả bây giờ nó là một nỗi đau. Khi viết nội dung của tệp trực tiếp trong Thuộc tính tệp, tệp đính kèm sẽ được đối tác chấp nhận. Trong trường hợp của tôi, điều này làm việc cho hầu như tất cả các giao dịch ngoại trừ PRA. Ở đây, phản hồi là dương và một AttachmentID sẽ được gửi nhưng tệp đính kèm không xuất hiện trong giao dịch.

Dưới đây là một ví dụ về phần đính kèm:

   <gwm:Attachment> 
        <gwm:File>/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ...</gwm:File> 
        <gwm:Filename>intro2.jpg</gwm:Filename> 
       </gwm:Attachment> 

Nếu tôi đặt RequireMtom cho Dịch vụ là True, tôi sẽ nhận được lỗi sau:

Das Präfix '' kann nicht von '' in 'http://www.starstandards.org/webservices/2005/10/transport' innerhalb desselben Startelementtags neu definiert werden.

Một mặt, nó hoạt động, mặt khác, tôi không chắc chắn nếu nó sẽ được gửi với các yếu tố XOP.

+0

Tôi đã thảo luận với các nhà phát triển dịch vụ web về việc đưa dữ liệu trực tiếp vào phần tử '' và họ nói điều này không phù hợp với đặc điểm kỹ thuật của chúng và chúng yêu cầu phần tử '' Xem http://stackoverflow.com/questions/8805095/soap-response-not-well-formed-xml-no-xop-parts-located-using-wse để biết thêm mô tả về vấn đề chúng tôi đang gặp phải. Muốn biết thêm chi tiết bên ngoài, xin vui lòng xem hồ sơ của tôi để biết địa chỉ email của tôi – anothershrubery

+0

Chắc chắn ... nhưng tôi không thể tìm thấy địa chỉ email của bạn –

+0

Nếu bạn không thể nhìn thấy nó dưới dạng sinh học, nó bây giờ là trong phần Giới thiệu về tôi pr của tôi ofile. – anothershrubery

Các vấn đề liên quan