WSE 3.0 - 字节数组编码为 Base64,而不是"MTOM-ing"二进制



关于这个区域,我还有几个其他问题,但现在有点多余了。如果有任何答案,我们也将不胜感激,但这个问题是我目前最关心的问题。

我已经学习了很多关于MTOM/XOP如何在WSE3.0中工作的例子,并按照需要设置了我的项目。我有一个字节数组字段,它被指定为DataType:-base64Binary。在这里,我放置了我想添加的附件的字节数组。当我运行应用程序并检查请求时,数据被内联编码为base64,即没有XOP-Include元素和相关的MIME部分。

我对WSE3.0中MTOM的理解是,在编码时,它将接受任何指定为base64Binary的字段,并将其编码为二进制,然后将其移动到MIME部分,用XOP-Include元素替换它。也就是说,它只是起了作用。但是,我已经在Reference文件中设置了服务来继承Microsoft.Web.Services3.WebServicesClientProtocol,并将RequireMtom标志设置为true,但它仍然没有正确编码。

我错过什么了吗?要使其发挥作用,还需要采取其他措施吗?

编辑:在第100次浏览了我的代码之后,我想知道这是否是因为在运行ProcessMessage方法之前必须串行化有效负载。这听起来可能是个问题吗?我们串行化的原因是,我们必须使用的方法接受一个具有内容属性的"Payload"参数,该内容属性是XMLElement属性,我们获得该属性的唯一方法是串行化所需的类。但这是否会阻止MTOM识别base64字段的数据类型,从而不使用MIME部分和XOP转换为二进制?只是现在真的抓救命稻草。

编辑2:虽然我在下面有一个解决方案,但第三方公司现在说我们的命名空间前缀是错误的!我们有类似<q1:Attachment xmlns:q1="http://whatever" />的东西,他们要求它是<s:Attachment xmlns:s="http://whatever" />。我是疯了还是没关系?有没有一种方法可以告诉它如何分配命名空间前缀?

好的,我终于弄明白了,它是在调用方法之前进行序列化的。我重写了传递给方法的类,这样它就不需要XMLElement作为属性,因此也不需要一个预序列化的类,并将其传递进来。这只需要3或4周的工作就可以正常工作。。。如果有人想要更多的澄清,我可以试着把它写在这里。

编辑:回应约翰·桑德斯的评论。当我说预序列化时,我的意思是包含字节数组的类在web方法中发送之前被序列化为XML。这是因为在web方法中发送的类只接受XMLElement。我重新编写了这个类,它是web方法的参数,以便在不事先序列化为XML的情况下接受另一个类。

Ie。这就是这个班现在的样子。添加并使用了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 

我知道这是很久以前的事了,但。。。

我也发生了同样的事情,事实证明,当它的767字节或更小时,我的byte数组就会排队:)当768(12*8*8)字节或更大时,它会移动到单独的部分。

所以它只是根据内容大小而变化。

相关内容

  • 没有找到相关文章

最新更新