Использование 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
и вставьте это в конфиг.