API web ASP.NET modular: cómo agregar / eliminar ruta en tiempo de ejecución a una API web

Estoy tratando de diseñar una aplicación de API web modular (¡no es una aplicación MVC!) En la que un usuario en el rol de administrador puede agregar o quitar módulos sin reiniciar la aplicación ASP.NET.

Módulo: cada módulo es un ensamblaje (archivo .dll) que contiene al menos una clase que se deriva deApiController.El enrutamiento se basa enEnrutamiento de atributos en ASP.NET Web API 2La producción de módulos (ensamblajes) no está dentro del alcance de esta pregunta.Los módulos (archivos de ensamblaje) se copian / eliminan de la carpeta `~ / plugins / en la raíz del proyecto. Este proceso tampoco está dentro del alcance de esta pregunta.El proyecto principal de API web ASP.NET tiene básicamente un solo controlador para administrar (agregar / eliminar) módulos. Los otros controladores se agregarán como módulos.

Entonces, el único controlador en el proyecto principal de API web es:

[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() simplemente busca y carga el ensamblado en el dominio de la aplicación medianteAppDomain.CurrentDomain.Load(). Esta parte está funcionando bien.

Configuration.MapHttpAttributeRoutes() no genera ningún error, pero rompe todo el sistema de enrutamiento. Después de esa línea, cualquier intento de enrutamiento causa este error:

El objeto aún no se ha inicializado. Asegúrese de que se llame a HttpConfiguration.EnsureInitialized () en el código de inicio de la aplicación después de todos los demás códigos de inicialización.

yo añadíHttpConfiguration.EnsureInitialized() al código, pero no resolvió el problema (mismo error).

Preguntas¿Este diseño tiene algún sentido? ¿Funcionará?¿Cómo puedo agregar una nueva ruta a la colección de rutas o actualizar completamente la colección de rutas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta