Модульный веб-API ASP.NET: как добавить / удалить маршрут во время выполнения к веб-API

Я пытаюсь разработать модульное приложение Web API (это не приложение MVC!), В котором пользователь с правами администратора может добавлять или удалять модули без перезапуска приложения ASP.NET.

Модуль: каждый модуль представляет собой сборку (файл .dll), которая содержит хотя бы один класс, производный отApiController.Маршрутизация основана наМаршрутизация атрибутов в ASP.NET Web API 2Производство модулей (сборок) не входит в сферу данного вопроса.Модули (файлы сборки) копируются в / удаляются из папки ~ ~ plugins / в корне проекта. Этот процесс также не входит в сферу этого вопроса.Основной проект ASP.NET Web API имеет в основном только один контроллер для управления (добавления / удаления) модулей. Другие контроллеры будут добавлены в виде модулей.

Таким образом, единственный контроллер в основном проекте Web API:

[RoutePrefix("api/modules")]
public class ModulesController : ApiController
{
    private ModuleService _moduleService = new ModuleService();

    // GET: api/Modules
    [Route]
    public IEnumerable<string> Get()
    {
        return _moduleService.Get().Select(a => a.FullName);
    }

    // POST: api/Modules/{moduleName}
    [Route("{id}")]
    public void Post(string id)
    {
        Assembly _assembly;
        var result = _moduleService.TryLoad(id, out _assembly);

        if(!result) throw new Exception("problem loading " + id);

        // Refresh routs or add the new rout
        Configuration.Routes.Clear();
        Configuration.MapHttpAttributeRoutes();
        // ^ it does not work :(
    }

    // DELETE: api/Modules/{moduleName}
    [Route("{id}")]
    public void Delete(string id)
    {
        _moduleService.Remove(id);
    }
}

ModuleService.TryLoad() просто находит и загружает сборку в домен приложения с помощьюAppDomain.CurrentDomain.Load(), Эта часть работает хорошо.

Configuration.MapHttpAttributeRoutes() не вызывает никаких ошибок, но нарушает всю систему маршрутизации. После этой строки любая попытка маршрутизации вызывает эту ошибку:

Объект еще не был инициализирован. Убедитесь, что HttpConfiguration.EnsureInitialized () вызывается в коде запуска приложения после всех других кодов инициализации.

я добавилHttpConfiguration.EnsureInitialized() к коду, но это не решило проблему (та же ошибка).

ВопросыИмеет ли этот дизайн смысл? Это будет работать?Как добавить новый маршрут в коллекцию маршрутов или полностью обновить коллекцию маршрутов?

Ответы на вопрос(1)

Ваш ответ на вопрос