关于这个区域,我还有几个其他问题,但现在有点多余了。如果有任何答案,我们也将不胜感激,但这个问题是我目前最关心的问题。
我已经学习了很多关于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)字节或更大时,它会移动到单独的部分。
所以它只是根据内容大小而变化。