2012-01-24 4 views
2

이 영역을 둘러싼 몇 가지 다른 질문이 있지만 지금은 약간 중복되어 있습니다. 그 (것)들에 어떤 응답든지 또한 평가 될 것이나이 질문은 분에 나의 주요 관심사이다.WSE 3.0 - Byte 배열이 Base64로 인코딩되고 "MTOM-ing"가 아닌 이진수로

필자는 MTOM/XOP가 WSE 3.0에서 작동하는 방식에 대한 많은 예제를 따라 왔으며 필요에 따라 프로젝트를 정확하게 설정했습니다. DataType : -base64Binary로 지정된 Byte 배열 필드가 있습니다. 여기에 추가 할 첨부 파일의 Byte 배열을 넣습니다. 애플리케이션을 실행하고 요청을 확인하면 데이터가 인라인으로 base64로 인코딩됩니다 (즉, XOP 포함 요소 및 관련 MIME 부분 제외).

WSE 3.0 내의 MTOM을 이해하면 인코딩 할 때 base64Binary로 지정된 모든 필드를 가져 와서 이진 코드로 인코딩 한 다음 MIME 파트로 이동하여 XOP Include 요소로 바꾸는 것이 좋습니다. 즉, 방금 효과가있었습니다. 그러나 참조 파일에서 Microsoft.Web.Services3.WebServicesClientProtocol 상속 서비스를 설정하고 RequireMtom 플래그를 true로 설정했는데 여전히 인코딩이 올바르지 않습니다.

여기에 뭔가가 빠졌습니까? 이 작업을 수행하기 위해 구현해야하는 다른 단계가 있습니까?

편집 : 100 시간 동안 내 코드를 살펴본 후 ProcessMessage 메서드를 실행하기 전에 페이로드를 serialize해야한다는 사실 때문에 문제가되는지 궁금합니다. 이게 문제가 될 것 같은데요? 우리가 직렬화 한 이유는 우리가 사용해야하는 메서드가 content 속성을 가진 "Payload"매개 변수를 받아들이 기 때문입니다.이 내용 속성은 XMLElement 속성이며 필요한 클래스를 serialize하는 유일한 방법입니다. 그러나 이것은 MT64가 base64 필드의 데이터 유형을 인식하는 것을 멈추고 따라서 MIME 부분과 XOP로 바이너리로 변환되지 않습니까? 그냥 빨대에 지금 정말로 쥐고 있습니다.

편집 2 : 아래 해결 방법이 있지만 써드 파티 회사는 현재 네임 스페이스 접두사가 잘못되었다고 말합니다. 우리는 <q1:Attachment xmlns:q1="http://whatever" />과 같은 것을 가지고 있고 그들은 그것이 <s:Attachment xmlns:s="http://whatever" /> 일 것을 요구하고 있습니다. 내가 화가 나거나 그게 중요하지 않니? 네임 스페이스 접두사를 할당하는 방법을 알려줄 수있는 방법이 있습니까?

+0

예제를 수정하지 않고 사용해 본 적이 있습니까? –

+0

내가 발견 한 모든 예제가 작동하려면 하나의 변경이 필요했고, 이는 'System.Web.Services.Protocols.SoapHttpClientProtocol' 대신'Microsoft.Web.Services3.WebServicesClientProtocol'을 상속하도록 클래스를 변경하는 것이 었습니다. 그 변화가 이루어지면 모든 것이 잘 작동했습니다. 그러나이 변경은 메소드를 호출하기 전에 직렬화 단계와 관련이 있다고 생각하기 때문에 코드에 차이가 없습니다. – anothershrubery

+0

예제가 작동하지만 코드가 작동하지 않는 상황에 이르면 작동 예제부터 시작하여 _slowly_ 리팩터링하여 코드 수행에 필요한 작업을 수행합니다. 내가 깨면 바로 이전 작업 코드로 되돌아 간다. 그리고 나서 내가 필요로하는쪽으로 천천히 움직인다. 그런 식으로, 나는 결국 무엇이 잘못되었는지 찾아 낸다. –

답변

1

오케이 마침내 알아 냈습니다. 메소드를 호출하기 전에 직렬화와 관련이 있습니다. 메서드에 전달 된 클래스를 다시 작성하여 XMLElement를 속성으로 필요로하지 않으므로 미리 직렬화 된 클래스로 전달했습니다. 3 ~ 4 주만 지나면 올바르게 작동합니다. 누군가가 더 명확히하기를 원한다면 여기로 내려와 볼 수 있습니다.

편집 : John Saunders comment에 대한 응답으로. 사전 직렬화라고 말하면, 바이트 배열을 포함하는 클래스가 웹 메소드 내에서 보내기 전에 XML에 직렬화되었다는 것을 의미합니다. 이는 웹 메소드에서 전송 된 클래스가 XMLElement 만 수락했기 때문입니다. 웹 메서드의 매개 변수 인 클래스를 미리 수정하여 XML에 직렬화하지 않고 다른 클래스를 수락했습니다.

e. 이것은 지금 수업이 보이는 방법입니다.processRepairOrder 필드와 PRO() 속성 추가 및 특정 네임 스페이스에 관해서으로 anyField

Partial Public Class Content 

    Private anyField As System.Xml.XmlElement 

    Private idField As String 

    Private anyAttrField() As System.Xml.XmlAttribute 

    'This was added 
    Private processRepairOrder As ProcessRepairOrder 

    'This was added 
    '''<remarks/> 
    <System.Xml.Serialization.XmlElementAttribute([ElementName]:="ProcessRepairOrder", [Namespace]:="http://www.starstandards.org/STAR")> _ 
    Public Property PRO() As ProcessRepairOrder 
     Get 
      Return Me.processRepairOrder 
     End Get 
     Set(ByVal value As ProcessRepairOrder) 
      Me.processRepairOrder = value 
     End Set 
    End Property 


    '''<remarks/> 
    <System.Xml.Serialization.XmlAnyElementAttribute()> _ 
    Public Property Any() As System.Xml.XmlElement 
     Get 
      Return Me.anyField 
     End Get 
     Set(ByVal value As System.Xml.XmlElement) 
      Me.anyField = value 
     End Set 
    End Property 

    '''<remarks/> 
    <System.Xml.Serialization.XmlAttributeAttribute(DataType:="token")> _ 
    Public Property id() As String 
     Get 
      Return Me.idField 
     End Get 
     Set(ByVal value As String) 
      Me.idField = value 
     End Set 
    End Property 

    '''<remarks/> 
    <System.Xml.Serialization.XmlAnyAttributeAttribute()> _ 
    Public Property AnyAttr() As System.Xml.XmlAttribute() 
     Get 
      Return Me.anyAttrField 
     End Get 
     Set(ByVal value As System.Xml.XmlAttribute()) 
      Me.anyAttrField = value 
     End Set 
    End Property 
End Class 

대신 사용되었다, 우리는 다음과 같은 필요한 클래스에 다른 필드를 추가 :

<System.Xml.Serialization.XmlNamespaceDeclarations()> _ 
Public xmlns As XmlSerializerNamespaces 

그럼 우리가 할 수 있었다 사용하여 네임 스페이스를 추가합니다 :

Dim ns As New Serialization.XmlSerializerNamespaces 
ns.Add("s", "http://whatever") 

class.xmlns = ns 
+0

"pre-serialized"로 무엇을 의미하는지 명확히한다면, 나는 upvote 할 것입니다. –

+0

수정했는데, 나는 그 말이 맞는지 설명했다. – anothershrubery

0

을 나는 그것이 오래 전 이었으나 것을 알고 ...

나는 똑같은 일이 일어나고 내 byte 배열은 767 바이트 이하가 될 때 줄 지어있다 :) 그리고 768 (12 * 8 * 8) 바이트 나 더 커.

콘텐츠 크기에 따라 다릅니다.