Question

I like the WCF 4.0 capabality to host a service without an .svc file by setting a serviceActivations in the config file. It work great using the default service factory but now I'm trying to do the same using the AutofaServiceHostFactory so my dependencies will be properly injected. In all scenarios I tried, I still got this error when I try to access to service : The service 'WCFAutofacWiring.MyService' configured for WCF is not registered with the Autofac container. I host my service in an empty asp.net web site. Here's what I did :

Web.config :

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

Then, I put a file in the app_code folder to register my dependency as stated in the Autofac documentation (Autofac WcfIntegration) and I confirmed with the debugger that the code is called at service start :

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

Finally, here's my registrations :

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

My service works perfectly if a use an .svc file instead of serviceActivation but I find it wasteful to create an .svc file if the only reason is to setup a factory that I can specify in my web.config.

Any idea ?

Thanks

Was it helpful?

Solution

According to the Autofac source, the exception is thrown if either a keyed resolution with the given string (from config) or a typed resolution using Type.GetType for the given string fails.

In your case the Type.GetType method probably returns null because you haven't specified a Type.AssemblyQualifiedName in the config.

Try getting typeof(MyService).AssemblyQualifiedName and insert that into the config.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top