在WCF中更改名称空间和schemaLocation属性

时间:2013-09-27 12:24:01

标签: wcf wsdl xml-namespaces

我在C#中开发了一个WCF服务。我们的客户已经拥有一个用Java编写的客户端软件。他们说,当他们试图添加我们的wcf服务referance时,他们会收到错误。他们认为关于名称空间的问题 我不太了解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?

1 个答案:

答案 0 :(得分:7)

如果您想从tempuri.org(默认为WCF)更改服务的命名空间,则需要在4个位置更改它:

  1. 服务合同
  2. 数据合同
  3. 服务实施
  4. 端点配置元素中的BindingNamespace
  5. 例如:

    // 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。

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