我在IIS 7下托管了 WCF客户端服务并使用Autofac的WCF集成。此服务由另一个WCF服务使用基本Http绑定调用。自服务开始使用以来,大约3个月前,所有东西都井。
但是,当我尝试通过net.tcp调用此服务时,我可以执行此操作并在一段时间内(通常约8小时)接收回调,之后我一直收到此错误:
无法激活所请求的服务'net.tcp://ecomsvc.webhost.com:12345 / EcomSvc.svc'。
来自托管服务器的例外是:
异常:System.ServiceModel.ServiceActivationException:由于编译期间发生异常,无法激活服务'/EcomSvc.svc'。异常消息是:必须先设置AutofacServiceHost.Container静态属性才能实例化服务.. ---> System.InvalidOperationException:必须先设置AutofacServiceHost.Container静态属性,然后才能实例化服务。
服务的标记:
<%@ ServiceHost
Service="EcomService.Contract.IEcomSvc, EcomService.Contract"
Factory="Autofac.Integration.Wcf.AutofacHostFactory, Autofac.Integration.Wcf" %>
Autofac注册:
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" %>
答案 0 :(得分:2)
这可能是因为您在WCF服务的Application_Start()
的{{1}}方法中进行了Autofac注册。
Global.asax
仅限HTTP。要与绑定无关(例如TCP),您需要另一个WCF服务的起点。
一个选项是Global.asax
- 方法。在WCF服务的根目录中创建一个AppInitialize
文件夹并添加一个类(名称并不重要),并添加一个带有此签名App_Code
的方法。
无论用于触发服务的绑定如何,此方法中的代码都将在服务启动时执行。您可以在此处进行Autofac注册。
可以找到有关public static void AppInitialize()
的更多信息here。