Domanda

Ho un paio di altre domande qui che circondano quest'area, ma ora sono un po 'ridondanti. Qualsiasi risposta a loro sarebbe anche apprezzata, ma questa domanda è la mia principale preoccupazione al momento.

Ho seguito molti esempi di come funziona MTOM/XOP in WSE 3.0 e ho impostato il mio progetto esattamente come sembra richiesto. Ho un campo di array di byte designato come tipo di dati: -base64binary. In questo ho messo l'array di byte dell'attacco che voglio aggiungere. Quando eseguo l'applicazione e controllo la richiesta, i dati sono codificati in linea come base64, cioè senza l'elemento XOP e la parte MIME associata.

La mia comprensione di MTOM all'interno di WSE 3.0 è stata che, quando la codifica prenderà qualsiasi campo designato come Base64Binario e lo codirà come binario e lo sposta in una parte MIME, sostituendolo con un elemento XOP XOP. Vale a dire, ha funzionato. Ma ho impostato il servizio, nel file di riferimento, per ereditare Microsoft.Web.Services3.WebServicesClientProtocol e hanno impostato il RequireMtom Flag to True, e non è ancora codifica correttamente.

Mi sono perso qualcosa qui? Esistono altri passaggi che dovrebbero essere implementati affinché questo funzioni?

EDIT: dopo aver esaminato il mio codice per la centesima volta, mi chiedo se potrebbe essere dovuto al fatto che devo serializzare il payload prima di eseguire il metodo ProcessMessage. Sembra che potrebbe essere un problema? Il motivo per cui abbiamo serializzato è perché il metodo che dobbiamo utilizzare accetta un parametro "payload" che ha una proprietà del contenuto, questa proprietà di contenuto è una proprietà XMLelement e l'unico modo in cui possiamo ottenere questo è di asserire la classe richiesta. Ma questo impedisce a MTOM di riconoscere il tipo di dati del campo Base64 e quindi non convertito in binario con le parti MIME e XOP? Adesso solo stringendo le cannucce.

EDIT 2: Mentre ho una soluzione di seguito, la società di terze parti ora sta dicendo che i nostri prefissi dello spazio dei nomi sono sbagliati! Abbiamo qualcosa di simile <q1:Attachment xmlns:q1="http://whatever" /> E lo stanno chiedendo <s:Attachment xmlns:s="http://whatever" />. Sto impazzendo o non importa? C'è un modo per dirgli come assegnare i prefissi dello spazio dei nomi?

È stato utile?

Soluzione

Ok, finalmente l'ho capito e aveva a che fare con la serializzazione prima di invocare il metodo. Ho riscritto la classe che è stata passata al metodo in modo che non richiedesse un XMlelement come proprietà, e quindi una classe pre-serializzata, e la ho trasmesso in. Questo funziona correttamente, dopo solo 3 o 4 settimane di lavoro. Se chiunque voglia ulteriori chiarimenti, posso provare a portarlo qui.

EDIT: in risposta al commento di John Saunders. Quando dico pre-serializzato intendo che la classe, contenente l'array di byte, è stata serializzata in XML prima di inviare con il metodo Web. Ciò era dovuto al fatto che la classe che veniva inviata nel metodo Web accettava solo un XMlelement. Ho rielaborato la classe, quello era il parametro del metodo Web, per accettare l'altra classe senza essere serializzato in XML in anticipo.

Cioè. Ecco come appare la classe ora. Il processRepairOrder campo e PRO() la proprietà è stata aggiunta e utilizzata al posto del 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

Per quanto riguarda gli spazi dei nomi specifici, abbiamo aggiunto un altro campo alle classi richieste in quanto tale:

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

Quindi siamo stati in grado di aggiungere lo spazio dei nomi usando:

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

class.xmlns = ns 

Altri suggerimenti

So che è passato molto tempo ma ...

Ho la stessa cosa che sta accadendo e come si scopre il mio byte L'array viene allineato quando i suoi 767 byte o più piccoli :) e viene spostato in parte separata quando i suoi byte 768 (12 * 8 * 8) o più grandi.

Quindi varia solo sulla dimensione del contenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top