gpt4 book ai didi

wcf - 使用 autofac 动态解析 WCF 端点地址

转载 作者:行者123 更新时间:2023-12-04 12:08:29 24 4
gpt4 key购买 nike

我有一个在 MVC 应用程序中使用的 WCF 客户端,它可以从多个 WCF 服务获取数据,服务的配置方式相同,并且实现相同的接口(interface),唯一的区别是暴露端点的地址。

这是我尝试过的:

  builder.Register(c => new ChannelFactory<IService>(
new BasicHttpBinding(),
new EndpointAddress("http://service.com/Service")))
.InstancePerHttpRequest();

builder.Register(c => c.Resolve<ChannelFactory<IService>>().CreateChannel())
.UseWcfSafeRelease();

这里的事情是 IService将始终从 http://service.com/Service 获取数据因为地址是硬编码在 Application_Start 中的某处MVC 应用程序的方法。

然后我尝试使用元数据:

    builder.Register(c => new ChannelFactory<IService>(
new BasicHttpBinding(),
new EndpointAddress("http://foo.com/Service")))
.SingleInstance().WithMetadata("name", "fooservice");

builder.Register(c => new ChannelFactory<IService>(
new BasicHttpBinding(),
new EndpointAddress("http://bar.com/Service")))
.SingleInstance().WithMetadata("name", "barservice");

builder.Register(c => c.Resolve<ChannelFactory<IService>>().CreateChannel())
.UseWcfSafeRelease();

但是这样我每次想添加相同的 WCF 服务时都必须编辑代码
在不同的服务器上实现。相反,我想从数据库中获取地址。

有什么方法可以更改每个服务调用的地址,或者至少在创建客户端实例时更改地址。

补充说明:

假设我有一个网站的五个确切副本,每个副本都有自己的域名和数据库,我希望能够执行以下操作:

foreach(Provider provider in providers)
{
SetServiceAddress(provider.Address);//how can i do that
_service.GetData()
}

最佳答案

在以下假设下:

  • 地址更改时绑定(bind)不会更改(例如,它不会从 HTTP 切换到 HTTPS)
  • 地址可能会根据每个请求而更改

  • 那么 我可能会结合 lambdas 和一个小接口(interface) 来解决它.

    首先,您需要一些可以从数据存储中检索地址的东西:
    public interface IAddressReader
    {
    Uri GetAddress();
    }

    它的实现将从数据库(或环境,或 XML 配置,或其他)中读取。

    然后我会在我的注册中使用它:
    builder
    .RegisterType<MyDatabaseAddressReader>()
    .As<IAddressReader>();
    builder
    .Register(c => new ChannelFactory<IService>(new BasicHttpBinding()))
    .SingleInstance();
    builder
    .Register(c =>
    {
    var reader = c.Resolve<IAddressReader>();
    var factory = c.Resolve<ChannelFactory<IService>();
    var endpoint = new EndpointAddress(reader.GetAddress());
    return factory.CreateChannel(endpoint);
    })
    .As<IService>()
    .UseWcfSafeRelease();

    这样你就可以接收 IService (或 Func<IService> )作为构造函数参数,您的调用类将不知道 Autofac、服务位置或端点。

    如果绑定(bind)也发生变化,它会变得更复杂一些。 您可能不希望为每个 channel 创建一个全新的 channel 工厂,因此您需要某种缓存机制,您可以在其中:
  • 从配置源获取设置。
  • 将这些设置与当前使用的设置进行比较。
  • 如果设置不匹配...
  • 处理掉之前的 channel 工厂。
  • 使用新设置创建新 channel 工厂。
  • 缓存 channel 工厂以供以后重用。
  • 返回当前 channel 工厂。

  • 如果您可以在设置上使用缓存依赖关系,那就更好了,但不是每个配置源都支持,所以 YMMV。我可能会为此实现一个自定义模块来封装逻辑,但我不会在这里全部写出来。

    关于wcf - 使用 autofac 动态解析 WCF 端点地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777844/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com