WSE 3.0 - байтовый массив кодируется как Base64, а не как MTOM-ing для двоичного
У меня есть пара других вопросов, касающихся этой области, но сейчас они немного излишни. Любые ответы на них также будут оценены, но этот вопрос является моей главной заботой в данный момент.
Я следовал за множеством примеров того, как MTOM/XOP работает в WSE 3.0, и настроил свой проект именно так, как кажется, требуется. У меня есть поле массива байтов, которое обозначается как DataType:-base64Binary. В этом я помещаю массив байтов вложения, которое я хочу добавить. Когда я запускаю приложение и проверяю запрос, данные кодируются в виде base64, т.е. без элемента XOP Include и связанной части MIME.
Мое понимание MTOM в WSE 3.0 заключалось в том, что при кодировании оно будет принимать любое поле, обозначенное как base64Binary, кодировать его как двоичное и перемещать его в часть MIME, заменяя его элементом XOP Include. То есть это просто сработало. Но я установил службу в справочном файле для наследования Microsoft.Web.Services3.WebServicesClientProtocol
и установили RequireMtom
признак истина, и это все еще не кодирует правильно.
Я что-то здесь пропустил? Есть ли какие-либо другие шаги, которые должны быть реализованы, чтобы это работало?
РЕДАКТИРОВАТЬ: После просмотра моего кода в сотый раз, я задаюсь вопросом, может ли это быть связано с тем, что мне нужно сериализовать полезную нагрузку перед запуском метода ProcessMessage. Похоже, это может быть проблемой? Мы сериализовали причину, потому что метод, который мы должны использовать, принимает параметр "Payload", который имеет свойство content, это свойство content является свойством XMLElement, и единственный способ получить это - сериализовать требуемый класс. Но останавливает ли это MTOM, распознающий тип данных поля base64 и, следовательно, не преобразуемый в двоичный файл с частями MIME и XOP? Просто сейчас цепляюсь за соломинку.
РЕДАКТИРОВАТЬ 2: Хотя у меня есть решение ниже, сторонние компании теперь говорят, что наши префиксы пространства имен неверны! У нас есть что-то вроде <q1:Attachment xmlns:q1="http://whatever" />
и они требуют, чтобы это было <s:Attachment xmlns:s="http://whatever" />
, Я схожу с ума или это не имеет значения? Есть ли способ, которым я могу сказать, как назначить префиксы пространства имен?
2 ответа
Хорошо, я наконец понял это, и это было связано с сериализацией перед вызовом метода. Я переписал класс, который был передан методу, чтобы он не требовал XMLElement как свойство, и, следовательно, предварительно сериализованный класс, и передал его. Это работает правильно, всего через 3 или 4 недели работы. Если кто-то хочет больше разъяснений, я могу попытаться получить это здесь.
РЕДАКТИРОВАТЬ: В ответ на комментарий Джона Сондерса. Когда я говорю pre-serialized, я имею в виду, что класс, содержащий байтовый массив, был сериализован в XML перед отправкой в веб-методе. Это было связано с тем, что класс, который отправлялся в веб-методе, принимал только XMLElement. Я переработал класс, который был параметром веб-метода, чтобы принять другой класс без предварительной сериализации в 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
Я знаю, что это было давно, но...
У меня происходит то же самое, и, как оказалось, мой byte
массив становится встроенным, когда его 767 байтов или меньше:) И он перемещается в отдельную часть, когда его 768 (12 * 8 * 8) байтов или больше.
Так что это просто зависит от размера контента.