WSE 3.0 - L'array di byte è codificato come base64 e non "mtom -ing" a binario
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?
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.