3

我用 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"and的属性namespaceschemaLocation属性是不同的。
如何更改 WCF 以生成他们想要的 wsdl xml?

4

1 回答 1

9

如果您想从 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 中使用。

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

于 2013-09-27T15:12:40.473 回答