Код веб-API в отдельной dll для сценария самостоятельного хостинга Owin/Katana

Я получил работающее приложение web-api 2, которое было разработано с использованием значений по умолчанию. Он находится в app.dll.

Теперь я пытаюсь добавить новый проект консольного приложения, который будет самостоятельно размещать это приложение с помощью Katana. Я добавил app.dll в качестве ссылки. Проблема в том, что когда я запускаю это автономное приложение и пытаюсь отправить простой запрос на получение в API, оно не находит никаких контроллеров. Я получил следующее сообщение об ошибке: No type was found that matches the controller named 'MyController'.

Теперь я пытаюсь принудительно найти контроллеры, используя здесь. Но, видимо, я делаю что-то не так, так как код в GetAssemblies() никогда не вызывается.

Пример кода ниже:

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.Services.Replace(typeof (IAssembliesResolver), new AssembliesResolver());
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );app
        appBuilder.UseWebApi(config);
    } 
}

public class AssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        ICollection<Assembly> baseAssemblies = base.GetAssemblies();
        List<Assembly> assemblies = new List<Assembly>(baseAssemblies);
        var controllersAssembly = Assembly.LoadFrom(@"app.dll");
        baseAssemblies.Add(controllersAssembly);
        return assemblies;
    }
}

person Grzegorz Sławecki    schedule 09.10.2014    source источник


Ответы (1)


Попробуйте создать новый класс AssemblyResolver в реальном проекте с помощью ApiControllers. Затем используйте это для получения сборки.

   public override ICollection<Assembly> GetAssemblies()
    {
        return new List<Assembly>
        {
            typeof (AssembliesResolver).Assembly
        };
    }

Это просто предполагает, что у вас есть только ApiControllers в этой единственной DLL.

person Adam    schedule 28.04.2015