Модульный веб-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()
к коду, но это не решило проблему (та же ошибка).