Использование Autofac с сервисом WCF с использованием WAS

Мне нравится возможность WCF 4.0 размещать сервис без файла.svc, устанавливая serviceActivations в файле конфигурации. Это прекрасно работает с использованием фабрики сервисов по умолчанию, но сейчас я пытаюсь сделать то же самое с помощью AutofaServiceHostFactory, чтобы мои зависимости были правильно введены. Во всех сценариях, которые я пробовал, я все еще получал эту ошибку при попытке доступа к службе: служба 'WCFAutofacWiring.MyService', настроенная для WCF, не зарегистрирована в контейнере Autofac. Я размещаю свой сервис на пустом веб-сайте asp.net. Вот что я сделал:

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 ответ

Решение

Согласно источнику Autofac, исключение выдается, если либо разрешение с ключом с заданной строкой (из конфигурации), либо типизированное разрешение с использованием Type.GetType для данной строки не получается.

В вашем случае Type.GetType метод, вероятно, возвращает null потому что вы не указали Type.AssemblyQualifiedName в конфиге.

Попробуй получить typeof(MyService).AssemblyQualifiedName и вставьте это в конфиг.

Другие вопросы по тегам