3

关于这个区域,我还有其他几个问题,但现在它们有点多余。对他们的任何回答也将不胜感激,但这个问题是我目前主要关心的问题。

我已经关注了许多关于 MTOM/XOP 如何在 WSE 3.0 中工作的示例,并且完全按照看起来需要的方式设置了我的项目。我有一个字节数组字段,它被指定为 DataType:-base64Binary。在此我放置了我要添加的附件的字节数组。当我运行应用程序并检查请求时,数据被内联编码为 base64,即没有 XOP Include 元素和相关的 MIME 部分。

我对 WSE 3.0 中的 MTOM 的理解是,在编码时,它将采用指定为 base64Binary 的任何字段并将其编码为二进制并将其移动到 MIME 部分,用 XOP Include 元素替换它。也就是说,它刚刚奏效。但是我已经在参考文件中将服务设置为继承Microsoft.Web.Services3.WebServicesClientProtocol并将RequireMtom标志设置为 true,但它仍然没有正确编码。

我在这里错过了什么吗?是否应该执行任何其他步骤才能使其正常工作?

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

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

4

2 回答 2

2

好的,我终于弄清楚了,这与调用方法之前的序列化有关。我重写了传入该方法的类,因此它不需要 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 
于 2012-01-25T12:24:26.800 回答
1

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

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

所以它只是因内容大小而异。

于 2016-10-25T08:26:41.517 回答