在WCF的soapresponse中自定义xmlns:a =标记

时间:2011-11-22 15:12:53

标签: c# wcf soap namespaces

我正在创建一个响应呼叫的服务。 但是客户端(不是我写的)无法读取响应。 我们所看到的是,这似乎是由于

中的不匹配命名空间
xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Classes"

无论如何都要覆盖这个命名空间? 我很确定它是。

[ServiceBehavior]标签具有“http://correctnamespace.com”NameSpace

app.config中的BindingNameSpace具有“http://correctnamespace.com”命名空间

[ServiceContract]具有“http://correctnamespace.com”命名空间

我查看了OperationsContract,看看我是否可以找到它但没有运气。

命名空间必须是“http://correctnamespace.com”

下面是SOAPresponse上部的完整示例

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<getAddressResponse xmlns="http://correctnamespace.com">
<getAddressReturn xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Classes" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:PropertyChanged i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.ComponentModel"/>
<a:addressField>Happystreet 21</a:addressField>

我希望有人可以帮我解决这个问题。

添加了信息

创建服务以适合客户。

客户端已预先设计,并且服务是基于客户端创建者提供的WSDL文件创建的。

另请注意,客户端无法修改。 :(

3 个答案:

答案 0 :(得分:0)

我有几点建议。

首先,假设服务器端代码沙存是正确且运行正常,请要求客户端重新生成客户端存根。它们可能以某种方式使用的存根是旧的或已被修改。

其次,如果服务器端也无法正常工作,我建议从头开始重新创建WSDL。正确的SOAP编码是WSDL到代码创建。因此,如果您的WSDL是由工具生成的,它将具有某种命名约定,而您可以手动更改xmlns之类的内容,如果您错过了一个(这听起来像是发生的那样),它将会破坏您的代码。因此,回过头来从头开始创建WSDL并从WSDL生成代码类,这样您就可以按照希望命名的方式命名所有内容。

答案 1 :(得分:0)

根据添加的信息,我再次提出两条建议。

首先,您必须进入并手动更改soap响应AddressReturn命名空间并遵循链,以便对上述响应的任何引用都具有正确的命名空间。这将是乏味和烦人的,但您可以编写一个xml解析器,它可以找到对此类字段的任何引用,并在架构和WSDL中进行必要的更改。

其次是使用客户端提供给您的WSDL,以便创建自己的WSDL,该WSDL将与客户端一起使用,但具有您想要合并的命名约定。 WSDL第一次编码可以通过这种方式完成,有时也会被推荐,因为它提供了您在创建和修改时遵循的框架,使其成为您自己的框架并满足您的需求。

答案 2 :(得分:0)

通过复制WSDL中的所有分类并使其成为DataContracts来解决,在此可以像ServiceContract一样定义NameSpace。

[DataContract(Namespace = "http://correctnamespace.com")]
public class Amount
{

感谢那些花时间帮助我解决问题的evryone。