2011-12-20 2 views
5

SOAP 요청에 첨부 파일을 추가하는 방법에 관해서 느슨한 편입니다. 우리는 자바로 제작 된 타드 파티 웹 서비스를 소비해야하는데, 이것은 내가 접하게 된 가장 복잡한 일이다. 첨부 파일을 필요로하는 다른 웹 서비스에는 첨부 파일을 추가 할 수있는 메소드 나 속성이 있습니다. 단순한. 그러나이 방법은 제공하지 않습니다.SOAP 요청에 첨부 파일 추가하기

SOAP 메시지의 버전은 정확히 XML을 원했지만 우리가 추가 할 수없는 파일의 MIME 부분입니다.

예 : 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 부분입니다, 그러나 그것은 잘못된 것입니다 XML 후

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

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

--MIMEBoundary-- 

나는 인터넷을 해답을 찾았지만 아무 것도 나오지 않았다. 이를 위해 WSE를 사용하는 것에 관한 많은 문서가없는 것 같습니다. 나는 WSE가 서버 측의 요구 사항이라는 것을 강조해야하며,이 문제를 해결하기 위해 기술을 변경할 수있는 방법은 없습니다.

이러한 MIME 섹션을 추가 할 수있는 방법이 있습니까?

편집 : 첨부 파일이 포함 된 SoapUI를 통해 작동하는 XML 문서를 가져올 수는 있지만, 코드 내에서 길을 찾지 못하는 것 같습니다.

나는이 문제에 대한 해결책을 얻기 위해 현상금을 추가했다. 누군가 다른 아이디어가 있다면 알려주세요.

EDIT again : 나는 여기에서 응답을 확인할 수 있었으므로 1 주일이 지난 것을 알고 있지만, 어떤 사람들은 내가 어디에서 볼 것인가에 대해 좋은 아이디어를 준다. 아직 공백을 그리는 중이다. XopDocument과 그 방법을 둘러싼 끔찍한 문서는 큰 단점이 있습니다. 누구든지 SaveToXopPackage을 사용하는 사례가 있다면 화를 내기 시작합니다.

+2

WSE는 더 이상 사용되지 않으므로 사용하지 않아야합니다. –

+1

글쎄요, John, 당신은 모든 것을 알고있는 것만으로 돌아 다니는 것보다는 해결 방법을 제안하는 것이 어떻습니까? 이 시나리오에서는 저에게 WSE가 필요합니다. 그것 없이는 우리의 요청이 거절 될 것입니다. 타사 공급 업체에게 코딩 방법을 알릴 수는 없지만 시도 할 수는 있지만 항상 세상에서 가장 도움이되지 않는 회사입니다. 따라서 WSE는 자체 소프트웨어를 만드는 경우에는 사용하지 말아야하지만이 경우에는 WSE가 필요합니다. – anothershrubery

+0

분명히 회사가 구식 소프트웨어를 사용해야하는 제 3 자와 비즈니스를 계속해야하는지 여부와 그렇지 않은 경쟁자에 대한 비즈니스 결정입니다. –

답변

6

나는 똑같은 문제에 직면했으며, 최종 해결책은 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=\"<[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();    
    } 

fileinput 함수는 파일의 원시 이진 데이터를 포함하는 SOAP 요청을 포함하는 파일의 절대 경로

+3

-1 "사용"블록이 없습니다. –

+0

나는 이것이 어떻게 작동하는지 정말로 모른다. 파일의 인라인에 원시 데이터를 포함한다고 말하면 내 시나리오에서는 가능하지 않습니다. 그것은 내가 준 예제에서 정의 된 XOP 섹션에 포함되어야합니다. 이 코드가 누락 된 경우 알려주십시오. – anothershrubery

+0

파일에는 첫 번째 게시물에서 설명하는 두 부분이 있어야합니다. XML 부분과 Ras 데이터 부분이 마임 영역으로 구분됩니다. "GIF89a @ "부분을 의미하는 Raw 데이터 부분은 아래 코드를 사용하여 간단한 문자열로 대체되어야합니다 : byte [] bt = File.ReadAllBytes (imageFile); string raw = System.Text.Encoding.Unicode.GetString (bt) ; 더 나은 stackoverflow 범위를 넘어 간다고 생각하기 때문에 직접 설명하기 위해 직접 저에게 연락하십시오. –

3

MIME 경계로 구분 끝에 부착되는 파라미터 제 생각에는 두 가지 옵션이있을 수 있습니다 :

1) MTOM을 사용하십시오. 이것은 보내는 메시지를 MIME 블록으로 자동 포장하는 것으로 보입니다.

2) Microsoft는 실제로 SoapEnvelope가 상속하는 XopDocument 클래스를 통해 mime을 사용하여 XOP 생성 및 읽기를 지원합니다.

저장 방법은 SaveToXopPackage이고 읽기 방법은 LoadFromXopPackage입니다.

그러나이 방법을 사용하면 HttpWebRequest를 통해 메시지를 직접 보내야 할 수도 있습니다. This blog에는이를 구현하는 방법의 예가 있습니다. 단점은 제대로 작동하려면 많은 코드와 구성이 필요하다는 것입니다.

이상적인 솔루션은 엔벨로프 전송을 수행하는 코드를 가로 채기위한 것이지만 파이프 라인에서 정확한 위치를 찾을 수 없습니다.

+0

이들은 몇 가지 예입니다. 이 작업을 수행하려고 할 때 사용한 참조 수를 MIME 첨부 블록을 보내도록 할 수는 있지만 첨부 파일의 바이너리 데이터를 MIME 부분에 추가하는 방법을 모르겠습니다. – anothershrubery

+1

또한 'SaveToXopPackage'에 대한 문서가 없을 수도 있습니다. Google은 28 개의 결과를 반환하며 대다수는 정확한 페이지입니다! – anothershrubery

1

SoapUI를 통해 작동한다고 말하면서 SoapUI에 보낸 생성 된 XML을 요청할 수 있으므로 어떻게 표시해야하는지 알 수 있도록 코드를 수정하십시오.

업데이트 : 귀하의 의견과 자세한 답변을 읽고 나면 : 해결책은 ktsiolis의 답변에서와 같이 HttpWebRequest를 사용하여 직접 바이트를 보내는 것입니다. 구체적으로 :

  • 이 SOAP의 XML (당신이 준 예)를 작성, UTF8 바이트이 인코딩 (1)
  • 초기 mimeboundary와 캐릭터 만들기 (의 부분을 당신의 "XML 전에"), UTF8 (2)의 바이트로 코드화
  • 두 번째 mimeboundary ("XML 이후"의 일부)에 대한 바이트를 작성하십시오. "--MIMEBOUNDARY"등이 포함 된 문자열을 만들고 UTF8 바이트로 인코딩하고 은 test.gif 파일의 모든 바이트를 추가합니다. (3)
  • 모든 바이트를 (2), (1) 그리고 (3) 그것을 전선을 통해 보내라.

트릭을 수행하지 않아야합니까?

+0

심각하게? 정확히 어떻게 보이는지 알고 있습니다. MIME 부분에 첨부 된 바이너리 데이터를 어떻게 얻을 수 있는지 모르겠습니다. – anothershrubery

2

저는 90 % 확신합니다. 여러분과 똑같은 프로젝트를 진행하고 있습니다. 그 비누 요청은 너무 친숙합니다 :-)

우리는 WCF로 전환하여 기본적으로 요청 객체를 손으로 코딩함으로써 (비누 형식과 일치하는 클래스를 만든 다음 xmlelement 속성을 사용하여) 그것을 장식하여 비누 요청처럼 보입니다. 파일 자체는 Attachment 클래스의 Byte()로 선언되고 xmlelement로 장식됩니다.

다음은 WCF 계약과 데이터 모델의 일부입니다. 실제 데이터 모델에는 추가 클래스 (Application Area, Data Area, Job 등)가 많이 있지만, 구조화 된 방식에 대한 충분한 정보를 제공합니다. 중요한 부분은 File By Byte (파일)입니다. 여기 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 

다음은 모든 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 

마지막으로 app.config가 있습니다. 우리가 메시지를 보내기 위해 Mtom을 사용하도록 WCF에 말하고 있기 때문에 마술이 있습니다. 이것은 Byte()를 취해 XOP : Include로 대체하는 별도의 MIME 섹션으로 분리합니다. 지금은 localhost를 통해 보내고 있으므로 tcpTrace를 사용하여 요청을 볼 수 있습니다. 그 응용 프로그램을 Google로 전송할 수 있지만 기본적으로 요청을 캡처하여 어떻게 보이는지 볼 수 있습니다. I 설정 tcpTrace 여기에 요청을 할 수있는 WCF 클라이언트에 실제 호출의 마지막

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

포트 84에서 수신 대기합니다.

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) 

다음은 tcpTrace를 통해 얻은 추적입니다. 그것은 기본 구조를 가지고 있으며 xml에서 바이너리 데이터를 추출하여 별도의 MIME 섹션에 배치합니다.

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> 

앞서 언급 한 것처럼 - 우리는 여전히 몇 가지 문제가 있습니다. Soap Header에서 누락 된 태그가 몇 개 있습니다.하지만 그 태그를 찾아 낼 수있을 것 같습니다. 진짜 문제는 Content-ID가 파트너가 수락 할 수있는 형식이 아니기 때문에 < [email protected]>와 같은 것으로 기대되며 .net은 http://tempuri.org/1/634618782531246992으로 형식을 지정합니다. 이로 인해 이스케이프 처리 된 컨텐트 ID를 비누 메시지 내부에서 읽는 방법을 모르기 때문에 웹 서비스 처리기가 중단됩니다.

+0

내 프로필에 내 이메일 주소를 볼 수 있습니다. – anothershrubery

+0

이제 편집을 알게되었습니다. 그래, 똑같은 프로젝트처럼 보일거야! 불행히도 귀하의 솔루션은 우리가 WSE를 사용하는 것으로 제한되어 있으므로 우리의 경우에는 작동하지 않을 것입니다 ... VS 2005의 신뢰. 그것은 고통입니다. 그러나 이것이 내가 찾고있는 결과이지만 WSE에서 해결책을 찾아야합니다. :(그러나 귀하의 문제와 함께 Content-ID를 원하는대로 설정할 수 없습니까? SoapUI 내에서 Content-ID를 직접 지정하고 기본 표현에 의존하지 않을 때 작동합니까? 내 이메일 주소, 작동하지 않음, – anothershrubery

0

그래, <gwm:File> 요소에있는 파일의 데이터를 수락하도록했습니다. 이 XOP를 사용하지 않고, 그래서 같은 요청이 지금 보이는 : SoapUI에 전달하면

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

이 그러나이 응답을 준다 코드에서 완벽하게 작동하지만, WSE1608: No XOP parts were located in the stream for the specified content-id: <rootpart*[email protected]>의 내부를 제외하고 Response is not well-formed XML. 말하는 오류가 발생합니다

기술적으로 다른 문제이므로 새로운 질문을 드리겠습니다.

다른 문제는 Soap response, not well formed XML, no XOP parts located, using WSE

0

나는 정확히 같은 프로젝트에 참여하고 있습니다에서 찾을 수 있습니다 나는이 스레드에서 설명한 것과 동일한 문제가! vb 2005 및 WSE 3.0의 향상된 기능을 사용하고 있으며 지금까지도 힘들었습니다. 파일 속성에 직접 파일 내용을 쓰면 파트너가 첨부 파일을 수락합니다. 필자의 경우, PRA를 제외한 거의 모든 트랜잭션에서 작동합니다. 여기에서 응답은 양수이며 AttachmentID가 전달되지만 첨부 파일은 트랜잭션에 표시되지 않습니다.

여기 첨부 파일 섹션의 예입니다

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

내가 참으로 서비스에 대한 RequireMtom을 설정하면, 나는 다음과 같은 오류 얻을 것이다 :

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

하나는 한 손으로, 그것은, 다른 한편으로는, 그것이 XOP 요소들과 함께 전송 될지 확신하지 못한다.

+0

웹 서비스 개발자들과 함께 데이터를 ''요소에 직접적으로 넣는 것에 대한 토론을했는데 이것들이 사양에 맞지 않다고 말하면 ''요소가 필요하다고했습니다. 우리가 가지고있는 문제에 대한 자세한 설명은 http://stackoverflow.com/questions/8805095/soap-response-not-well-formed-xml-no-xop-parts-located-using-wse를 참조하십시오. 더 이상 토론하고 싶지 않다면 내 이메일 주소에 대한 내 프로필을 참조하십시오. – anothershrubery

+0

물론 ... 이메일 주소를 찾을 수 없습니다. –

+0

약력 아래서 볼 수 없다면, 지금 내 소개 섹션에 있습니다. 내 홍보 ofile. – anothershrubery

관련 문제