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

C# 仅为WCF服务上可用的一个服务合约接口生成客户端,c#,.net,wcf,service-reference,servicecontract,C#,.net,Wcf,Service Reference,Servicecontract,我目前正在重构一个大型WCF服务,它由多个不同的客户端应用程序使用的一个服务契约接口(“SCI”)组成。我对SCI进行了拆分,因此对于每种类型的客户端应用程序,都有一个特定于其所需操作的SCI。SCI的某些共享部分在基础SCI中定义,特定于客户端应用程序的SCI继承该基础SCI 只有一个服务类实现了所有特定于客户端的SCI。共享基本SCI中存在菱形接口继承情况这一事实有时意味着通过多个SCI可以使用相同的操作。当自动生成客户机(尤其是异步客户机方法)时,生成的代码有许多丑陋的1,2,3等 为了避

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

只有一个服务类实现了所有特定于客户端的SCI。共享基本SCI中存在菱形接口继承情况这一事实有时意味着通过多个SCI可以使用相同的操作。当自动生成客户机(尤其是异步客户机方法)时,生成的代码有许多丑陋的
1,2,3

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

这可能吗


对于在这种情况下实现模块化和代码重用的任何其他技巧,我们也将不胜感激。

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

然后,不要使用服务引用,而是使用通道工厂绑定到您的服务(如下所示)。这是一种更好的引用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();
var binding=newWebHttpBinding();
var factory=newchannelfactory(绑定,新端点地址(“http://url:port"));
添加(新的WebHttpBehavior());
var myService=factory.CreateChannel();
myService.ServiceMethod();

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

在生产环境中,您可能需要对性能进行一些单例检查,并对服务实现进行单独的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;
}
专用通道工厂CreateFactoryInstance(字符串endpointConfigurationName,字符串endpointAddress)
{
ChannelFactory=null;
工厂=新的ChannelFactory(endpointConfigurationName,新的EndpointAddress(EndpointAddress));
factory.Open();
返回工厂;
}

这意味着要使用服务的通道实现客户端?是否可以通过自动生成的异步操作获取自动生成的客户端类型?是的,您可以通过使用异步版本装饰WCF服务来实现这一点,请参阅本文:IE:[OperationContract(AsyncPattern=true)]IAsyncResult BeginDide(双n1,双n2,异步回调,对象状态);双端除法(IAsyncResult ar);给出了一个异步方法我看到了如何手动使操作异步,但是在代码生成器可以为您执行的几十个操作中执行此操作看起来很难看。我仍然想知道如何为特定的服务合同生成代码。我想我明天回去工作时会尝试一下channel factory方法,正如你们都推荐的那样。