2010-09-30 71 views
3

如何添加XML前缀到WCF消息序列化中的字段?如何向WCF消息序列化中的字段添加XML前缀?

我连接起来,从.NET一个Java Spring的web服务,以及一个对象,我通过与参数被序列化如你所愿:

<MyClass> 
    <field1>Field 1 Value</field1> 
    <field2>Field 2 Value</field2> 
</MyClass> 

然而,网络服务要求类和字段前缀命名空间,假设命名空间blah,所以我要的是:

<blah:MyClass> 
    <blah:field1>Field 1 Value</blah:field1> 
    <blah:field2>Field 2 Value</blah:field2> 
</blah:MyClass> 

我怎样才能做到这一点的WCF?有没有办法在我的课上调整XML序列化属性?

编辑: WSDL对于这个特定的实体如下(编辑删除特定的业务字段名,但一切是一样的):

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch0="http://www.domain.com/app/schemas/entityone" xmlns:sch1="http://www.domain.com/app/schemas/types" xmlns:sch2="http://www.domain.com/app/schemas/query" xmlns:sch3="http://www.domain.com/app/schemas/entitytwo" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.domain.com/app/schemas/entityone" targetNamespace="http://www.domain.com/app/schemas/entityone"> 
    <wsdl:types> 
    <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:types="http://www.domain.com/app/schemas/types" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.domain.com/app/schemas/entityone" xmlns:tns="http://www.domain.com/app/schemas/entityone"> 
    <import namespace="http://www.domain.com/app/schemas/types" /> 

<element name="TheClassName"> 
<complexType> 
    <sequence> 
    <element name="field1" type="string" /> 
    <element name="field2" type="string" /> 
    <element name="field3" type="string" /> 
    <element name="field4" type="string" /> 
    <element name="field5" type="string" /> 
    <element name="field6" type="string" /> 
    <element name="field7" type="string" /> 
    <element name="field8" type="string" /> 
    </sequence> 
</complexType> 
</element> 

<wsdl:binding name="NameOfBindingHere" type="tns:ReturnTypeHere"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="OperationNameHere"> 
    <soap:operation soapAction="" /> 
    <wsdl:output name="ResponseTypeHere"> 
     <soap:body use="literal" /> 
    </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 
+0

你可以编辑这个服务的WSDL来创建一个只包含失败操作的WSDL,然后发布编辑后的WSDL?了解这是RPC还是文档服务等是非常重要的。 – 2010-09-30 19:00:23

+0

@John,请参阅更新的问题 – Brandon 2010-09-30 19:09:40

+0

您需要包含WSDL的其余部分。这是将声明这些名称空间声明的部分,等等。 – 2010-09-30 19:10:16

回答

-2

尝试定义MyClass的是:

DataContract(namespace="blah") 
Class MyClass 
{ 
    [DataMember] 
    Field1 ... 

    [DataMember] 
    Field2 ... 
} 

UPDATE 这不会创建前缀,但如果XML具有正确的名称空间并且Java应该可以工作,则不需要前缀。

+0

这将定义** XML名称空间** - 但是** NOT **在XML有效载荷的序列化中使用的任何前缀.... – 2010-09-30 19:01:43

+0

请参阅我的更新... – Aliostad 2010-09-30 19:05:40

+1

将其更改为但web服务只是抱怨xmlns是意外的内容.. – Brandon 2010-09-30 19:26:08

1

我认为你是混淆名称空间和前缀。在你的例子中,Blah是前缀,是命名空间的指针(别名)。在文档中,您将看到一个属性xmlns:blah =“http:// tempuri/your/namespace”,前缀为blah,名称空间为http://tempuri/your/namespace

只要指向相同的确切名称空间,使用的前缀对谁使用文档无关紧要。

所以

<blah:MyClass xmlns:blah="http://tempuri/your/namespace"></blah:MyClass>

是完全一样的东西

<blah1:MyClass xmlns:blah1="http://tempuri/your/namespace"></blah1:MyClass> 

XML模式不要求应该用什么前缀。

Aliostad的DataContract示例正是如何定义Data Contract Serializer将使用的名称空间。无法定义DataContract序列化程序将使用的前缀,因为前缀无关紧要。只要使用这种XML的服务符合XML标准(并且不像RegEx表达式,并且相信我,我已经看到很多情况,XML的使用者是定制的书写文本解析器而不是使用XML解析器并没有掌握XML命名空间和Infosets的概念)。

+0

我倾向于不是真正的XML解析器,因为xmlns =使它成为barf ...: ( – Brandon 2010-10-04 02:12:23

+0

你是否曾经解决过你的问题?因为我有类似的问题,并通过扩展IClientMessageFormatter并将它挂接到WCF调用来解决它。 – 2011-08-08 06:58:00