Modular ASP.NET Web API: Hinzufügen / Entfernen einer Route zur Laufzeit zu einer Web API

Ich versuche, eine modulare Web-API-Anwendung zu entwerfen (dies ist keine MVC-Anwendung!), In der ein Benutzer mit Administratorrolle Module hinzufügen oder entfernen kann, ohne die ASP.NET-Anwendung neu zu starten.

Module: Jedes Modul ist eine Assembly (DLL-Datei), die mindestens eine Klasse enthält, die von @ abgeleitet isApiController.Routing basiert auf Attribut-Routing in der ASP.NET-Web-API 2ie Herstellung von Modulen (Baugruppen) fällt nicht in den Geltungsbereich dieser FragModules (Assembly-Dateien) werden in den Ordner `~ / plugins / im Stammverzeichnis des Projekts kopiert bzw. aus diesem gelöscht. Dieser Vorgang fällt auch nicht in den Geltungsbereich dieser Frage.Das Haupt-ASP.NET-Web-API-Projekt verfügt grundsätzlich nur über einen Controller zum Verwalten (Hinzufügen / Entfernen) von Modulen. Die anderen Controller werden als Module hinzugefügt.

So ist der einzige Controller im Haupt-Web-API-Projekt:

[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() findet die Assembly einfach und lädt sie in die Anwendungsdomäne, indem @ verwendet wirAppDomain.CurrentDomain.Load(). Dieser Teil funktioniert gut.

Configuration.MapHttpAttributeRoutes() löst keinen Fehler aus, bricht aber das gesamte Routingsystem. Nach dieser Zeile verursacht jeder Routing-Versuch diesen Fehler:

Das Objekt wurde noch nicht initialisiert. Stellen Sie sicher, dass HttpConfiguration.EnsureInitialized () im Startcode der Anwendung nach allen anderen Initialisierungscodes aufgerufen wird.

Ich fügte hinzuHttpConfiguration.EnsureInitialized() an den Code, aber das Problem konnte nicht behoben werden (gleicher Fehler).

Frage Macht dieser Entwurf Sinn? Wird es funktionierenWie kann ich der Routensammlung eine neue Route hinzufügen oder die Routensammlung vollständig aktualisieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage