我在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?
答案 0 :(得分:7)
如果您想从tempuri.org(默认为WCF)更改服务的命名空间,则需要在4个位置更改它:
例如:
// 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。
他们如何建立自己的客户?您的服务是否在他们可以看到的地方运行?