【发布时间】:2016-07-13 17:38:55
【问题描述】:
我创建了一个 MVC 应用程序,它将调用 WCF 服务上的方法。我已将客户端应用程序配置为使用 autofac、autofac.integration.mvc 和 autofac.integration.wcf。我使用以下 autofac 注册码:
var builder = new ContainerBuilder();
builder
.Register(c => new ChannelFactory<IUserService>())
.SingleInstance();
builder
.Register(c => new ChannelFactory<IUserService>(
new BasicHttpBinding(),
new EndpointAddress(@"http://localhost:36763/UserService.svc")))
.SingleInstance();
builder
.Register(c => c.Resolve<ChannelFactory<IUserService>>().CreateChannel())
.As<IUserService>()
.UseWcfSafeRelease();
但我希望能够避免对端点地址进行硬编码。有没有办法在不对端点地址进行硬编码的情况下做到这一点?
更新。我尝试了下面列出的代码,该代码无需硬编码端点地址即可工作。但它引入了对 UserServiceClient 的依赖。
var builder = new ContainerBuilder();
string endpointAddress;
using (var userServiceClientProxy = new UserServiceClient())
{
endpointAddress = userServiceClientProxy.Endpoint.Address.Uri.OriginalString;
}
builder
.Register(c => new ChannelFactory<IUserService>(
new BasicHttpBinding(),
new EndpointAddress(endpointAddress)))
.SingleInstance();
builder
.Register(c => c.Resolve<ChannelFactory<IUserService>>().CreateChannel())
.As<IUserService>()
.UseWcfSafeRelease();
builder.Register(l => LogManager.GetLogger(nameof(WcfClient2))).As<ILog>()
.SingleInstance();
builder.RegisterControllers(Assembly.GetAssembly(typeof(HomeController)));
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
【问题讨论】:
-
您是否考虑过将配置文件放入某个地方? app.config 或 json 文件。你没有提到你正在使用的 MVC 版本,所以我不能说哪个是合适的。
-
我正在使用 MVC 5、.NET 4.5.2。我想我可以从客户端的 web.config 中获取值,但我希望有一种更优雅的方式来确定端点地址。
-
我听说有一种方法可以使端点可被发现,但我还没有尝试过。需要调查的东西。
标签: c# wcf autofac wcf-client