2012-01-24 26 views
2

我在这里围绕这个区域有几个其他问题,但它们现在有点多余。对他们的任何答案也将不胜感激,但这个问题是我最关心的问题。WSE 3.0 - 字节数组被编码为Base64,而不是“MTOM-ing”以二进制形式

我遵循了很多关于MTOM/XOP如何在WSE 3.0中工作的例子,并且完全按照它的要求设置了我的项目。我有一个被指定为DataType的Byte数组字段:-base64Binary。在这我把我想添加的附件的字节数组。当我运行应用程序并检查请求时,数据以base64内联编码,即没有XOP包含元素和关联的MIME部分。

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

我在这里错过了什么吗?是否还有其他步骤需要实施?

编辑:通过我的代码第100次查看后,我想知道是否可能是由于我必须在运行ProcessMessage方法之前序列化有效载荷的事实。这听起来像它可能是一个问题?我们已经序列化的原因是因为我们必须使用的方法接受一个具有content属性的“Payload”参数,这个content属性是一个XMLElement属性,我们唯一可以得到的就是序列化所需的类。但是,这是否会停止MTOM识别base64字段的数据类型,因此不会将其转换为MIME部分和XOP的二进制文件?现在只需要抓住吸管。

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

+0

你有没有得到任何没有修改的例子工作? –

+0

我发现的所有示例都需要一个更改才能工作,那就是将类更改为继承'Microsoft.Web.Services3.WebServicesClientProtocol'而不是'System.Web.Services.Protocols.SoapHttpClientProtocol'。一旦做出改变,一切正常。但是,这种改变并没有改变我的代码,因为我怀疑它在调用方法之前与序列化步骤有关。 – anothershrubery

+0

每当我遇到这个例子工作的情况,但我的代码没有,我开始工作的例子,然后_slowly_重构它做我需要我的代码做。只要我分手,我就回到以前的工作代码,然后慢慢地走向我所需要的。这样,我最终发现了什么问题。 –

回答

1

好吧,我终于搞明白了,它是在调用方法之前进行序列化。我重写了传入该方法的类,因此它不需要XMLElement作为属性,因此也不需要预先序列化的类,并将其传入。此工作仅在工作3或4周后才能正常工作。如果任何人想要更多的澄清,我可以试着把它放在这里。

编辑:在回应约翰桑德斯评论。当我说预序列化时,我的意思是包含字节数组的类在发送到web方法之前被序列化为XML。这是因为在Web方法中发送的类只接受XMLElement。我重写了这个类,它是web方法的参数,接受另一个类而不事先序列化为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

如果你会澄清你的意思是“预先序列化”,那么我会upvote。 –

+0

编辑,我不知道我是否解释了正确! – anothershrubery

0

我知道它已经很长一段时间以前,但...

我有同样的事情发生,因为它变成我的byte数组进入时,它的767个字节或更小:) 当它的768(12 * 8 * 8)字节或大。

所以它只是在内容大小上有所不同。

相关问题