我用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?
如果要从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模式中进行导入时,模式定位实际上是完全可选的,因此,如果它们依赖于其中的某些值,则它们不符合xsd要求。
我想他们在使用您的WSDL时遇到了困难,并且不太了解问题所在,因此选择将责任归咎于您的服务。在basicHttpBinding上公开的服务元数据是整个WCF堆栈中最可互操作的,并且应该100%可从Java消耗。
他们如何建立自己的客户?您的服务在他们可以看到的地方运行吗?