【问题标题】:Customizing the xmlns:a= tag in a soapresponse from WCF在 WCF 的肥皂响应中自定义 xmlns:a= 标记
【发布时间】:2012-01-03 23:18:26
【问题描述】:

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

xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Classes"

有没有办法覆盖这个命名空间? 我很确定是的。

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

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 文件创建的。

还要注意不能修改客户端。 :(

【问题讨论】:

    标签: c# wcf soap namespaces


    【解决方案1】:

    我有几个建议。

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

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

    【讨论】:

    • 在帖子中添加了附加信息。这解释了为什么我不能使用你提供的解决方案
    【解决方案2】:

    根据补充的信息,我再次提出两个建议。

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

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

    【讨论】:

    • 这确实看起来很乏味,在合约的某个地方没有像[ServiceContract(Namespace = "correctnamespace.com", Name = "MyService")]这样的覆盖方法吗?这就是我为接口设置通用命名空间的方式
    • 通过从 WSDL 中复制所有 lassed 并将其改为 DataContracts 来解决,在这种情况下,无法像 ServiceContract 那样定义 NameSpace
    【解决方案3】:

    通过复制 WSDL 中的所有类并将它们制作成 DataContract 来解决,在这种情况下,可以像定义 ServiceContract 一样定义 NameSpace。

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

    感谢所有花时间帮助我解决问题的人。

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多