3

Mon application Web doit permettre à un utilisateur administrateur d'ajouter et de supprimer des dossiers desservis d'une application .net core 2. J'ai trouvé un moyen de fournir une liste de dossiers servis, mais je ne peux pas trouver un moyen de les ajouter ou de les supprimer dynamiquement une fois que l'application a été configurée. Comment puis-je réexécuter la fonction de configuration à partir de l'application?Ajouter de nouveaux emplacements FileServer après le démarrage (modifier le middleware après le démarrage)

Sinon, comment ajouter ou supprimer des configurations UseFileServer() dans un service déjà en cours d'exécution? J'utilise. Net core 2.0.0-preview2-final.

Répondre

2

Vous pouvez injecter dynamiquement le middleware FileServer en fonction de vos paramètres.

Il est un exemple de projet sur Github Chris Ross Microsoft: https://github.com/Tratcher/MiddlewareInjector/tree/master/MiddlewareInjector

Vous devez ajouter les MiddlewareInjectorOptions, MiddlewareInjectorMiddleware et MiddlewareInjectorExtensions cours de la mise en pension mentionnée ci-dessus à votre projet.

Ensuite, dans votre classe de démarrage, inscrivez-vous le MiddlewareInjectorOptions comme un singleton (il est disponible dans votre application) et utiliser le MiddlewareInjector:

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddSingleton<MiddlewareInjectorOptions>(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     app.UseDeveloperExceptionPage(); 

     var injectorOptions = app.ApplicationServices.GetService<MiddlewareInjectorOptions>(); 
     app.UseMiddlewareInjector(injectorOptions); 
     app.UseWelcomePage(); 
    } 
} 

Ensuite, injecter les MiddlewareInjectorOptions où vous voulez et configurer le middleware dynamique , comme ceci:

public class FileServerConfigurator 
{ 
    private readonly MiddlewareInjectorOptions middlewareInjectorOptions; 

    public FileServerConfigurator(MiddlewareInjectorOptions middlewareInjectorOptions) 
    { 
     this.middlewareInjectorOptions = middlewareInjectorOptions; 
    } 

    public void SetPath(string requestPath, string physicalPath) 
    { 
     var fileProvider = new PhysicalFileProvider(physicalPath); 

     middlewareInjectorOptions.InjectMiddleware(app => 
     { 
      app.UseFileServer(new FileServerOptions 
      { 
       RequestPath = requestPath, 
       FileProvider = fileProvider, 
       EnableDirectoryBrowsing = true 
      }); 
     }); 
    } 
} 

Notez que ce MiddlewareInjector peut injecter un seul middleware, de sorte que votre code doit appeler UseFileServer() pour chaque chemin que vous voulez servir.

J'ai créé un Contenu essentiel avec le code requis: https://gist.github.com/michaldudak/4eb6b0b26405543cff4c4f01a51ea869

+0

Cela ne résout pas mon problème. Je dois enregistrer les nouveaux emplacements UseFileServer APRES le démarrage. Je l'ai testé, et une fois que l'application est en cours d'exécution, tous les nouveaux appels app.UseFileServer ne font rien. – TwitchBronBron

+0

Ma solution devrait fonctionner, alors. Puisque vous avez un MiddlewareInjectorOptions de singleton, vous pouvez l'utiliser quand vous voulez (il suffit de l'obtenir du conteneur de service). Je l'ai testé moi-même il y a un certain temps et ça semble fonctionner correctement. –

+0

S'il vous plaît jeter un oeil à la Gist que je viens d'ajouter - Au début, il n'y a pas de fonctionnalité de serveur de fichiers. Ce n'est que lorsque vous accédez à l'URL/enable-file-server que vous accédez au contenu des lecteurs C et D en accédant aux URL/c et/d, respectivement. –