Autofac WcfIntegration - 通过 net.tcp 进行通信时,无法激活 WCF 客户端服务
本文关键字:激活 WCF 服务 客户端 通信 通过 WcfIntegration net tcp Autofac | 更新日期: 2023-09-27 18:31:48
我有一个在IIS 7下托管的WCF客户端服务,并使用Autofac的WCF集成。此服务由另一个 WCF 服务使用基本 Http 绑定调用。自从大约 3 个月前开始使用该服务以来,一切运行良好。
但是,当我尝试通过net.tcp调用此服务时,我能够执行此操作并在一段时间(通常约为8小时)内接收回调,之后我不断收到此错误:
无法激活请求的服务"net.tcp://ecomsvc.webhost.com:12345/EcomSvc.svc"。
托管服务器的异常是:
异常:System.ServiceModel.ServiceActivation异常:由于编译过程中出现异常,无法激活服务"/EcomSvc.svc"。 异常消息为:必须先设置 AutofacServiceHost.Container 静态属性,然后才能实例化服务。---> System.InvalidOperationException:必须先设置 AutofacServiceHost.Container 静态属性,然后才能实例化服务。
服务的标记:
<%@ ServiceHost
Service="EcomService.Contract.IEcomSvc, EcomService.Contract"
Factory="Autofac.Integration.Wcf.AutofacHostFactory, Autofac.Integration.Wcf" %>
汽车注册:
private static void SetupDependencyContainer()
{
var builder = new ContainerBuilder();
// Register service implementations.
builder.RegisterType<EcomSvc>().As<IEcomSvc>();
// Set the dependency resolver.
var container = builder.Build();
AutofacHostFactory.Container = container;
}
从上述 Autofac 注册调用客户端的 WCF 服务:
private static void SetupDiContainer()
{
var builder = new ContainerBuilder();
// Register service implementations
builder.RegisterType<HandlerSvc>().As<IHandlerSvc>();
builder.RegisterType<HandlerService().InstancePerLifetimeScope();
ConfigureServices(builder);
//register other dependencies
builder.RegisterType<ProxyCache>().As<IProxyCache>().InstancePerLifetimeScope();
// Set the dependency resolver.
var container = builder.Build();
AutofacHostFactory.Container = container;
}
private static void ConfigureServices(ContainerBuilder builder)
{
RegisterService<IEcomSvc>(builder, "EcomServiceTCP");
}
public static void RegisterService<T>(ContainerBuilder builder, string endpoint)
{
builder.Register(c => new ChannelFactory<T>(endpoint))
.SingleInstance();
builder.Register(c => c.Resolve<ChannelFactory<T>>().CreateChannel())
.As<T>().UseWcfSafeRelease();
}
标记:
<%@ ServiceHost
Service="HandlerService.IHandlerSvc, HandlerService"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>
发生这种情况可能是因为您在 WCF 服务的Global.asax
的Application_Start()
方法中执行 Autofac 注册。
Global.asax
是仅限HTTP的。要与绑定无关(例如 TCP),您需要 WCF 服务的另一个起点。
一个选项是AppInitialize
方法。在 WCF 服务的根目录中创建一个 App_Code
文件夹,并添加一个类(名称不重要)并添加具有此签名public static void AppInitialize()
的方法。
此方法中的代码将在服务启动时执行,而不考虑用于触发服务的绑定。您可以在此处进行Autofac注册。
有关AppInitialize
的更多信息,请点击此处。