6

我添加了对具有两个端点的 WCF 服务的引用。添加服务时,将以下内容添加到配置文件中:

<client>
  <endpoint name="ABCServiceV1" address="http://staging.ABCwebservices.com/ABC/Service.svc"
    binding="basicHttpBinding" bindingConfiguration="ABCServiceV1"
    contract="ABCService.IService"  />
  <endpoint name="ABCServiceV2" address="http://staging.ABCwebservices.com/ABC/Service.svc/20"
    binding="basicHttpBinding" bindingConfiguration="ABCServiceV2"
    contract="ABCService.IService1"  />
</client>

创建客户端的代码如下:

ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV2");

但是,我收到运行时错误 - “在 ServiceModel 客户端配置部分中找不到名称为 'ABCServiceV2' 和合同 'ABCService.IService' 的端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为没有可以在客户端元素中找到匹配此名称的端点元素。”

如果我使用ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV1");,那么一切正常。但是当使用 ABCServiceV2 时,它会尝试寻找合同 - ABCService.IService - 它应该在寻找时 - ABCService.IService1。

我如何让它寻找正确的合同?

4

2 回答 2

3

如果您添加了对不同服务 (ABCServiceV2) 的第二个引用,那么我相信这将为 ABCServiceV2 生成第二个服务类。这两个类将实现单独的合同(ABCService.IService 和 ABCService.IService1),因此您将无法互换端点。

我相信您应该能够像这样初始化您的两个服务端点:

ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV1");
ABCService.Service1Client ABCClient1 = new Service1Client("ABCServiceV2");
于 2013-01-16T23:33:51.263 回答
2

即使这篇文章很旧并且已经回答,但答案对我来说并没有帮助。我的问题是我使用svcutil.exe工具生成了服务客户端,但根本没有指定任何命名空间;所以合约命名空间名称默认生成为模式文档的目标命名空间,是的,一团糟。

另一方面,我试图使用将服务引用添加到项目时生成的配置文件。此文件中的合约命名空间是 ServiceReference1(默认情况下)或您想要的任何其他名称,完美风暴!但我所要做的就是从 FQN<endpoint>的 contract 属性中删除命名空间部分,然后 CLR 就可以看到该合约。

希望这对其他人有帮助

于 2017-07-15T05:22:35.250 回答