2017-02-22 2 views
0

Ich versuche, einige JavaScript von eingebetteten Ressourcen in einer Klassenbibliothek zu dienen. Ich habe es geschafft, über die IFileProvider herauszufinden und meine eigene erstellt, die jetzt gut funktioniert. Das Problem, das ich jetzt habe, ist jedoch, dass physische statische Dateien (von wwwroot) nicht mehr gefunden werden.ASP.NET Core: Benutzerdefinierte IFileProvider verhindert Standard IFileProvider funktioniert

Ich habe folgendes in meiner Startup.cs Datei:

app.UseStaticFiles(
    new StaticFileOptions() 
    { 
     // Override file provider to allow embedded resources 
     FileProvider = new CompositeFileProvider(
      HostingEnvironment.ContentRootFileProvider, 
      new EmbeddedScriptFileProvider()), 

     //etc 
    }); 

ich die CompositeFileProvider verwendet haben angenommen hätte würde bedeuten, dass, wenn die Datei nicht in einem der Dateianbieter gefunden wird, dann wird es die anderen versuchen. Ich gehe auch davon aus, dass der Standard-Dateianbieter der ist, den ich als HostingEnvironment.ContentRootFileProvider angegeben habe. Ist das falsch?

Die einzige andere Sache, die ich denken kann ist, dass das Problem von innerhalb meines Providers selbst in der GetFileInfo() Methode kommt. Die Definition, welche sich wie folgt:

public IFileInfo GetFileInfo(string subpath) 
{ 
    if (string.IsNullOrEmpty(subpath)) 
    { 
     return new NotFoundFileInfo(subpath); 
    } 

    if (subpath.StartsWith("/", StringComparison.Ordinal)) 
    { 
     subpath = subpath.Substring(1); 
    } 

    var metadata = EmbeddedScripts.FindEmbeddedResource(subpath); 

    if (metadata == null) 
    { 
     return new NotFoundFileInfo(subpath); 
    } 

    return new EmbeddedResourceFileInfo(metadata); 
} 

Könnte es, dass NotFoundFileInfo(subpath) zurückkehren, um meine Probleme für die körperliche CSS verursacht, js und andere statische Dateien? Wenn ja, was soll ich hier zurückgeben, damit das System den anderen Dateianbieter verwendet?

Antwort

1

OK nach einer kleinen Graben im Quellcode (ist es nicht toll, dass .NET ist jetzt Open Source ?!), gelang es mir, die folgenden Links zu finden waren sehr hilfreich in der Tat:

CompositeFileProvider.cs - Based über die Implementierung in GetFileInfo() kann ich sehen, dass ich null statt NotFoundFileInfo(subpath) zurückgeben sollte, wenn ich möchte, dass die anderen Anbieter versuchen, es zu lösen.

StaticFileMiddleware.cs - Diese Datei zeigt, dass, wenn die FileProvider nicht angegeben ist (null), wenn statische Dateikonfiguration mit app.UseStaticFiles einrichten, dann wird es eine mit der folgenden Codezeile beheben:

_fileProvider = _options.FileProvider ?? Helpers.ResolveFileProvider(hostingEnv);

Und betrachtet man Helpers.cs zeigt den folgenden Code:

internal static IFileProvider ResolveFileProvider(IHostingEnvironment hostingEnv) 
{ 
    if (hostingEnv.WebRootFileProvider == null) 
    { 
     throw new InvalidOperationException("Missing FileProvider."); 
    } 
    return hostingEnv.WebRootFileProvider; 
} 

Daher war meine Annahme, HostingEnvironment.ContentRootFileProvider zu verwenden, falsch. Ich sollte stattdessen HostingEnvironment.WebRootFileProvider verwenden.

Alles funktioniert jetzt wie es soll.

Verwandte Themen