WSE 3.0 - байтовый массив кодируется как Base64, а не как MTOM-ing для двоичного - PullRequest
3 голосов
/ 24 января 2012

У меня есть пара других вопросов, касающихся этой области, но теперь они немного излишни. Любые ответы на них также будут оценены, но этот вопрос является моей главной заботой в данный момент.

Я следил за множеством примеров того, как MTOM / XOP работает в WSE 3.0, и настроил свой проект именно так, как кажется необходимым. У меня есть поле массива байтов, которое обозначается как DataType: -base64Binary. В этом я помещаю массив байтов вложения, которое я хочу добавить. Когда я запускаю приложение и проверяю запрос, данные кодируются в виде base64, т.е. без элемента XOP Include и связанной части MIME.

Мое понимание MTOM в WSE 3.0 заключалось в том, что при кодировании он будет принимать любое поле, обозначенное как base64Binary, кодировать его как двоичный и перемещать его в часть MIME, заменяя его элементом XOP Include. То есть это просто сработало. Но я установил службу в справочном файле для наследования Microsoft.Web.Services3.WebServicesClientProtocol и установил для флага RequireMtom значение true, и он все еще не корректно кодируется.

Я что-то здесь упустил? Есть ли какие-либо другие шаги, которые должны быть реализованы, чтобы это работало?

РЕДАКТИРОВАТЬ: После просмотра моего кода в сотый раз, я задаюсь вопросом, может ли это быть связано с тем, что мне нужно сериализовать полезную нагрузку перед запуском метода ProcessMessage. Похоже, это может быть проблемой? Мы сериализовали причину, потому что метод, который мы должны использовать, принимает параметр «Payload», который имеет свойство content, это свойство content является свойством XMLElement, и единственный способ получить это - сериализовать требуемый класс. Но останавливает ли это MTOM, распознающий тип данных поля base64 и поэтому не преобразуемый в двоичный файл с частями MIME и XOP? Просто сейчас цепляюсь за соломинку.

РЕДАКТИРОВАТЬ 2: Хотя у меня есть решение ниже, сторонние компании сейчас говорят, что наши префиксы пространства имен неверны! У нас есть что-то вроде <q1:Attachment xmlns:q1="http://whatever" />, и они требуют, чтобы это было <s:Attachment xmlns:s="http://whatever" />. Я схожу с ума или это не имеет значения? Есть ли способ, которым я могу сказать, как назначить префиксы пространства имен?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Хорошо, я наконец понял это, и это было связано с сериализацией перед вызовом метода.Я переписал класс, который был передан методу, чтобы он не требовал 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 
0 голосов
/ 25 октября 2016

Я знаю, что это было давно, но ...

У меня происходит то же самое, и, как выясняется, мой массив byte становится встроенным, когда его 767 байтов или меньше :) И этоперемещается в отдельную часть, когда его 768 (12 * 8 * 8) байтов или больше.

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

...