【问题标题】:Changing namespace and schemaLocation attributes in WCF在 WCF 中更改命名空间和 schemaLocation 属性
【发布时间】:2013-09-27 12:24:00
【问题描述】:

我用 C# 开发了一个 WCF 服务。我们的客户已经拥有一个用 Java 编写的客户端软件。他们说当他们尝试添加我们的 wcf 服务引用时,他们得到一个错误。他们认为关于命名空间的问题。
我不太了解 WCF 中的命名空间或任何其他标记细节。
他们说 wcf 服务的 wsdl 输出必须如下所示:

<xsd:import id="base" namespace="http://helios.theircompanyName.com/im schemaLocation="http://wwwdev1.theirCompanyName.com:8000/HeliosIM/im?xsd=1"/>

但我们的服务提供:

<xsd:import schemaLocation="http://myComputerName/MyWcfProjectFolder/MyWcfService.svc?xsd=xsd0" namespace="http://tempuri.org/"/>

可以看出,我的服务没有id="base"namespace这样的属性,schemaLocation属性不同。
如何更改 WCF 以生成他们想要的 wsdl xml?

【问题讨论】:

  • 首先,您使用的是什么绑定?
  • @hugh 我使用 basicHttpBinding。
  • 第一个问题:你使用了 WCF。第二个问题,您正在使用 wsdl。解决方案:停止使用 WSDL 和 WCF。开始使用 REST 和 Web API,您的生活将会变得更加简单。

标签: wcf wsdl xml-namespaces


【解决方案1】:

如果您想从 tempuri.org(这是 WCF 的默认设置)更改服务的命名空间,您需要在 4 个地方进行更改:

  1. 服务合同
  2. 数据合同
  3. 服务实现
  4. 端点配置元素中的BindingNamespace

例如:

// Service Contract
[ServiceContract(Namespace="http://myNamespace")]
public interface IMyService
{}

// Data Contract
[DataContract(Namespace="http://myNamespace")]
public class MyType
{}

// Service implementation
[ServiceBehavior(Namespace="http://myNamespace")]
public class Service : IMyService
{}

<!-- In config -->
<endpoint address="http://whatever" 
          bindingNamespace="http://myNamespace"
          binding="basicHttpBinding" 
          contract="Something.IMyService" />

但是,我真的不明白他们为什么告诉你这是必要的。作为服务的提供者,您提供什么命名空间取决于您,而不是他们。无论此值设置为什么,它们在使用 wsdl 时都可能会遇到相同的问题。

schemaLocation 也是如此,同样,此位置指向的位置并不取决于他们。当您在 xml 模式中进行导入时,Schemalocation 实际上是完全可选的,因此如果它们依赖于其中的某些值,那么它们不符合 xsd。

我猜他们在使用您的 WSDL 时遇到了困难,并且不太明白哪里出了问题,因此选择了责怪您的服务。在 basicHttpBinding 上公开的服务元数据是整个 WCF 堆栈中最具互操作性的,并且应该 100% 可以从 java.util 中使用。

他们是如何尝试建立客户的?您的服务是否在他们可以看到的地方运行?

【讨论】:

  • 我也认为他们责怪我们的服务,因为他们不知道他们在应用程序中收到的错误。您关于在 wcf 中定义名称空间的总结非常清楚。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
相关资源
最近更新 更多