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) байтов или больше.

Так что это просто зависит от размера контента.

Другие вопросы по тегам