使用WAS将Autofac与WCF服务一起使用

mbe*_*Net 2 c# wcf was autofac

我喜欢通过在配置文件中设置serviceActivations来托管没有.svc文件的服务的WCF 4.0功能.它使用默认服务工厂很好用但现在我正在尝试使用AutofaServiceHostFactory做同样的事情,所以我的依赖项将被正确注入.在我尝试的所有场景中,当我尝试访问服务时仍然遇到此错误:为WCF配置的服务"WCFAutofacWiring.MyService"未向Autofac容器注册.我在一个空的asp.net网站上托管我的服务.这是我做的:

Web.config:

<serviceHostingEnvironment>
  <serviceActivations>
    <add factory="Autofac.Integration.Wcf.AutofacServiceHostFactory"
     relativeAddress="~/WASCurrentTime.svc"
     service="WCFAutofacWiring.MyService" />
  </serviceActivations>
</serviceHostingEnvironment>
Run Code Online (Sandbox Code Playgroud)

然后,我在app_code文件夹中放入一个文件来注册我的依赖关系,如Autofac文档(Autofac WcfIntegration)中所述,我向调试器确认在服务启动时调用了代码:

public static class AppStart
{
    public static void AppInitialize()
    {
        AutofacHostFactory.Container = new AutofacBootstrapper().Configure();
    } 
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我的注册:

public class AutofacBootstrapper
{
    public IContainer Configure()
    {
        var builder = new ContainerBuilder();

        // register types 
        builder.Register<ILanguageProvider>(x => new MyLanguageProvider("en-US"));
        builder.RegisterType<MyService>();

        return builder.Build();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用.svc文件而不是serviceActivation,我的服务可以正常工作但是如果唯一的原因是设置我可以在web.config中指定的工厂,我发现创建.svc文件会很浪费.

任何的想法 ?

谢谢

khe*_*ang 5

根据Autofac源代码,如果具有给定字符串(来自config)的键控分辨率或使用Type.GetType给定字符串的类型化分辨率失败,则抛出异常.

在您的情况下,该Type.GetType方法可能会返回,null因为您没有Type.AssemblyQualifiedName在配置中指定a .

尝试获取typeof(MyService).AssemblyQualifiedName并将其插入配置中.