2014-01-13 111 views
2

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

Web.config文件:

<serviceHostingEnvironment> 
    <serviceActivations> 
    <add factory="Autofac.Integration.Wcf.AutofacServiceHostFactory" 
    relativeAddress="~/WASCurrentTime.svc" 
    service="WCFAutofacWiring.MyService" /> 
    </serviceActivations> 
</serviceHostingEnvironment> 

然后,我把文件中的App_Code文件夹注册我的依赖作为Autofac文档(Autofac WcfIntegration)中规定,我与调试证实,该代码被称为在服务启动:

public static class AppStart 
{ 
    public static void AppInitialize() 
    { 
     AutofacHostFactory.Container = new AutofacBootstrapper().Configure(); 
    } 
} 

最后,这是我的注册:

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(); 
    } 
} 

如果使用.svc文件而不是serviceActivation,我的服务可以很好地工作,但如果创建一个.svc文件,我觉得很浪费,如果唯一的原因是要设置一个我可以在我的web.config中指定的工厂。

有什么想法?

感谢

+1

您是否尝试过使用该服务的完全限定名称?即'service =“WCFAutofacWiring.MyService,MyAssembly”'。 – khellang

+0

是的,不起作用。对于我所看到的,问题不是来自类型无法解析的事实(错误消息包含程序集名称,所以我很确定它已被找到),但注册不被使用(或者aren不正确)。另一种可能性是AutofacHostFactory.Container在WAS上下文中不起作用。 –

+0

这不是错误消息中的程序集名称,而是您在配置中指定的名称。它可以是任何东西:) – khellang

回答

5

按照Autofac source,如果任一给定的字符串(从配置)键控分辨率或使用Type.GetType对于给定的字符串类型化解析失败抛出异常。

在您的情况下,Type.GetType方法可能返回null,因为您尚未在配置中指定Type.AssemblyQualifiedName

尝试获取并将其插入到配置中。

+0

嗨。你没有给我确切的答案,但你给我提示我需要解决这个问题。问题出现在web.config(缺少的程序集)和注册中。我之前单独尝试了两个修复程序,但将它们放在一起解决了问题。谢谢 –

+1

出于好奇(以后可能会帮助其他人),注册有什么问题? – khellang

+0

合格的名字确实是个问题。什么解决了我的问题:1.在web.config中:服务名称和端点合同的限定名称; 2. .svc Service中的限定名称服务 –