仅为WCF服务上可用的一个服务合同接口生成客户端

时间:2011-12-13 23:29:12

标签: c# .net wcf service-reference servicecontract

我目前正在重构一个大型WCF服务,该服务由多个不同客户端应用程序使用的一个服务契约接口(此处为“SCI”)组成。我已经拆分了SCI,因此对于每种类型的客户端应用程序,都有一个特定于其所需操作的SCI。 SCI的一些共享部分是在基础SCI中定义的,客户端应用程序特定SCI继承。

有一个服务类可以实现所有客户端特定的SCI。从共享基础SCI存在菱形接口继承情况的事实有时意味着通过多个SCI可以获得相同的操作。在自动生成客户端时(特别是使用异步客户端方法),生成的代码有许多丑陋的<generated-type>1,2,3等...

为了避免这种情况,我想为每个客户端应用程序添加一个服务引用,这些客户端应用程序只生成与该特定应用程序相关的SCI客户端。由于相同的功能出现在不同的SCI上,这应该不会导致问题。

这可能吗?

在这种情况下实现模块化和代码重用的任何其他技巧也将受到赞赏。

2 个答案:

答案 0 :(得分:1)

您要做的是创建一个服务合同接口(您可以手动执行此操作,将其从原始服务实现中拉出来或自动生成然后将其复制出来)。

然后使用通道工厂绑定到您的服务(如下所示),而不是使用服务引用。这是一种更好的引用WCF服务的方式。

您需要以下参考资料才能执行此操作:

using System.ServiceModel;
using System.ServiceModel.Description;

然后您可以使用以下内容:

     var binding = new WebHttpBinding();
     var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port"));
     factory.Endpoint.Behaviors.Add(new WebHttpBehavior());

     var myService = factory.CreateChannel();

     myService.ServiceMethod();

答案 1 :(得分:0)

卢克的建议值得一试。 'ChannelFactory'方式比自动生成方式有许多优点:您可以保留SCi的注释,并且在SCI更改后无需更新引用。

在生产中,您可能需要为性能做一些Singleton chache,并为服务实现分离SCI,因此您可以在客户端和服务实现中引用您的SCI。

你提到'异步',我认为这可能是绑定或行为配置问题。

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress)
{
    ChannelFactory factory = null;
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress));
    factory.Open();
    return factory;
}