2012-01-24 7 views
2

ここにはこの領域を取り巻くいくつかの質問がありますが、今は少し冗長です。それらに対する回答も高く評価されますが、この質問は私の主な関心事です。WSE 3.0 - バイナリに "MTOM-ing"ではなく、Base64としてエンコードされているバイト配列

MTOM/XOPがWSE 3.0でどのように機能し、プロジェクトが必要と思われるように正確にセットアップされているか、多くの例を追ってきました。 DataType:-base64Binaryとして指定されているByte配列フィールドがあります。これで、私が追加したい添付ファイルのバイト配列を配置します。アプリケーションを実行してリクエストをチェックすると、データはbase64としてインラインでエンコードされます。つまり、XOPインクルード要素と関連するMIME部分はありません。

WSE 3.0内のMTOMを理解すると、エンコードするときにbase64Binaryと指定されたフィールドをすべてバイナリとしてエンコードし、MIMEパートに移動してXOP Includeエレメントに置き換えるということでした。すなわち、それはちょうど働いた。しかし、私は、参照ファイルでMicrosoft.Web.Services3.WebServicesClientProtocolを継承し、RequireMtomフラグをtrueに設定したサービスを設定しましたが、それでも正しくエンコーディングされていません。

ここに何か忘れましたか?これが機能するために実装すべき他のステップはありますか?

EDIT:100回目のコードを調べた後、ProcessMessageメソッドを実行する前にペイロードをシリアル化する必要があるかどうかは疑問です。これは問題のように聞こえますか?私たちが直列化した理由は、使用するメソッドがContentプロパティを持つ "Payload"パラメータを受け入れるためです。このコンテンツプロパティはXMLElementプロパティであり、これを取得できる唯一の方法は必要なクラスをシリアル化することです。しかしこれは、MTOMがbase64フィールドのデータ型を認識するのを止め、MIME部分とXOPを使ってバイナリに変換しないのですか?ちょうど実際にストローで握っている。

編集2:私は以下の解決策がありますが、サードパーティの企業は現在、私たちの名前空間接頭辞が間違っていると言っています!我々は<q1:Attachment xmlns:q1="http://whatever" />のようなものを持っていて、彼らはそれが<s:Attachment xmlns:s="http://whatever" />であることを要求しています。私は怒っているのですか?それは問題ではありませんか?名前空間接頭辞をどのように割り当てるのかを教える方法はありますか?

+0

変更を加えずに実施した例はありますか? –

+0

私が見つけたすべての例では、動作するために1つの変更が必要でした。それは、 'System.Web.Services.Protocols.SoapHttpClientProtocol'の代わりに' Microsoft.Web.Services3.WebServicesClientProtocol'を継承するようにクラスを変更することでした。その変更が行われると、すべて正常に機能しました。しかし、この変更はメソッドを呼び出す前に直列化ステップと関係があると思われるので、私のコードに違いはありません。 – anothershrubery

+0

サンプルがうまく動作しているのにコードがそうでない状況に陥ると、実際のサンプルから始めて、まず_slowly_リファクタリングしてコードを実行する必要があります。私はそれを壊すとすぐに、私は以前の作業コードに戻ってから、もっとゆっくりと必要なものに移動します。そうすれば、私は最終的に何が間違っているのかを見つける。 –

答えて

1

私は最終的にそれを理解しました。メソッドを呼び出す前に、シリアライゼーションに関係していました。メソッドに渡されたクラスを書き換えて、プロパティとしてXMLElementを必要とせず、したがってプリシリアライズされたクラスを渡しました。これは3〜4週間の作業後に正しく動作します。誰かがもっと明確にすることを望むなら、私はここでそれを理解しようとすることができます。

EDIT:John Saundersコメントへの回答。私がプリ・シリアライズと言うとき、私はバイト配列を含むクラスがWebメソッド内で送信する前にXMLにシリアライズされたことを意味します。これは、Webメソッドで送信されていたクラスがXMLElementのみを受け入れたためです。 Webメソッドのパラメータであるクラスを修正して、あらかじめ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)バイトまたは大きい。

コンテンツのサイズによって異なります。

関連する問題