3

このエリアについて他にもいくつか質問がありますが、今は少し冗長です。それらへの回答もいただければ幸いですが、この質問は現時点での私の主な関心事です。

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

WSE 3.0 内の MTOM についての私の理解では、エンコード時に base64Binary として指定された任意のフィールドを取得し、それをバイナリとしてエンコードして MIME パーツに移動し、XOP の Include 要素に置き換えます。つまり、それはうまくいきました。しかし、参照ファイルでサービスを継承するMicrosoft.Web.Services3.WebServicesClientProtocolように設定し、RequireMtomフラグを true に設定しましたが、まだ正しくエンコードされていません。

ここで何かを見逃しましたか?これが機能するために実装する必要がある他の手順はありますか?

編集: 100 回目のコードを調べた後、ProcessMessage メソッドを実行する前にペイロードをシリアル化する必要があるためではないかと考えています。これは問題になる可能性があるように聞こえますか?シリアル化した理由は、使用する必要があるメソッドが、コンテンツ プロパティを持つ「ペイロード」パラメーターを受け入れるためです。このコンテンツ プロパティは XMLElement プロパティであり、これを取得できる唯一の方法は、必要なクラスをシリアル化することです。しかし、これにより、MTOM が base64 フィールドのデータ型を認識しなくなり、MIME パーツと XOP でバイナリに変換されなくなりますか? 今は本当にストローをつかんでいます。

編集 2: 以下に解決策がありますが、サードパーティの会社は、名前空間のプレフィックスが間違っていると言っています! のようなものが<q1:Attachment xmlns:q1="http://whatever" />あり、彼らはそれを要求しています<s:Attachment xmlns:s="http://whatever" />。私は怒っていますか、それとも問題ではありませんか?名前空間プレフィックスを割り当てる方法を教えてくれる方法はありますか?

4

2 に答える 2

2

わかりました、私はついにそれを理解しました、そしてそれはメソッドを呼び出す前にシリアル化と関係がありました。メソッドに渡されたクラスを書き直して、プロパティとしてXMLElementを必要としないようにしたため、事前にシリアル化されたクラスを渡しました。これは、わずか3〜4週間の作業で正しく機能します。誰かがより明確にしたい場合は、ここでそれを理解することを試みることができます。

編集:ジョン・サンダースのコメントに応えて。事前シリアル化とは、バイト配列を含むクラスが、Webメソッド内で送信する前にXMLにシリアル化されたことを意味します。これは、Webメソッドで送信されていたクラスがXMLElementのみを受け入れたためです。Webメソッドのパラメーターであるクラスを作り直して、事前にXMLにシリアル化せずに他のクラスを受け入れるようにしました。

つまり。これがクラスの現在の外観です。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 
于 2012-01-25T12:24:26.800 に答える