C# 以编程方式使用不同的WCF配置配置单个WCF操作

C# 以编程方式使用不同的WCF配置配置单个WCF操作,c#,.net,wcf,configuration,C#,.net,Wcf,Configuration,我刚刚开始使用WCF,并希望建立一个可分发的网络系统,如下所示:(但不确定是否可行。) 我有一个具有业务逻辑的.net客户端。它将需要来自不同来源的各种数据,因此我想添加一个“服务器”,其中包含内存缓存,但也包含WCF功能,以便从数据源发送/接收和发布/订阅未缓存的数据。我认为这些服务器应用程序在代码方面应该是相同的,但高度可配置的,以便可以以对等方式处理请求,或者根据需要使用传统的客户机-服务器。我认为可以这样做,本质上,服务器向配置了端点的任何地方发送请求并获得响应 基本上,服务器的配置如下

我刚刚开始使用WCF,并希望建立一个可分发的网络系统,如下所示:(但不确定是否可行。)

我有一个具有业务逻辑的.net客户端。它将需要来自不同来源的各种数据,因此我想添加一个“服务器”,其中包含内存缓存,但也包含WCF功能,以便从数据源发送/接收和发布/订阅未缓存的数据。我认为这些服务器应用程序在代码方面应该是相同的,但高度可配置的,以便可以以对等方式处理请求,或者根据需要使用传统的客户机-服务器。我认为可以这样做,本质上,服务器向配置了端点的任何地方发送请求并获得响应

基本上,服务器的配置如下所示:

Server A
========

Operation 1 - Endpoint I
Operation 2 - Endpoint II


Server B
========

Operation 1 - Endpoint IV
Operation 2 - Endpoint III
每个服务器的配置将存储在app.config中,并在启动时加载到内存中。因此,每个WCF操作都有自己的WCF配置(在端点等方面),并根据该配置将特定请求发送到不同的位置

根据我对WCF的了解,我认为这是可能的。我不知道我是否有足够的经验来了解这是否是我正在描述的标准WCF模式(如果是,请让我知道)。否则,我的主要问题是,如何以编程方式配置WCF中的每个操作(如上所述)

如果我没有解释清楚,请告诉我

提前感谢您的帮助,
Will

我不知道这是否能满足您的需求,但我知道这是我用来将WCF端点添加到Windows服务的工具。这是服务运行以加载所有wcf服务的代码:

IDictionary<string, ServiceHost> hosts;
NetTcpBinding binding;
CustomBinding mexBinding;

private void AddService(Type serviceImp, Type serviceDef, string serviceName)
    {
        ServiceHost host = new ServiceHost(serviceImp);

        string address = String.Format(baseAddress, wcfPort, serviceName); 

        string endAdd = address;
        string mexAdd = address + "/mex";

        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
        host.Description.Behaviors.Add(behavior);
        host.AddServiceEndpoint(serviceDef, binding, endAdd);
        host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexAdd);

        host.Open();

        hosts.Add(serviceDef.Name, host);
    }
IDictionary主机;
有约束力;
定制绑定;
私有void AddService(类型serviceImp、类型serviceDef、字符串serviceName)
{
ServiceHost主机=新的ServiceHost(serviceImp);
string address=string.Format(baseAddress、wcfPort、serviceName);
字符串endAdd=地址;
字符串mexAdd=地址+“/mex”;
ServiceMetadataBehavior行为=新ServiceMetadataBehavior();
host.Description.Behaviors.Add(行为);
AddServiceEndpoint(serviceDef、binding、endAdd);
AddServiceEndpoint(typeof(imeadataexchange)、mexBinding、mexAdd);
host.Open();
添加(serviceDef.Name,host);
}
有一个
baseAddress
字符串我没有复制进去,但它只有端点的net.tcp地址。同样,对于
wcfPort
。不同的基址和端口用于调试、测试和生产

如果不清楚,
serviceImp
是服务实现,
serviceDef
是定义合同的接口。希望这有帮助

编辑-以下是我用来帮助我理解所有这些东西的一些参考资料:




据我所知,您不能根据每个操作指定配置。最低级别是接口级别。最简单(丑陋)的解决方案是将每个操作放在单独的接口中。

将每个操作放在单独的接口中是一种有效且良好的设计方法。Agatha请求/响应层遵循这种方法。看看这个,这是非常有用和可扩展的


感谢Pawel,了解它非常有用。将每个操作放在单独的界面中是一种有效且良好的设计方法。Agatha请求/响应层遵循这种方法。看看这个,这是非常有用和可扩展的