2017-02-22 60 views
0

Я пытаюсь выполнить некоторые JavaScript из встроенных ресурсов в библиотеке классов. Мне удалось узнать о IFileProvider и создать мою собственную, которая сейчас хорошо работает. Тем не менее, проблема, которую я имею сейчас, заключается в том, что физические статические файлы (от wwwroot) больше не найдены.Ядро ASP.NET: пользовательский IFileProvider предотвращает работу стандартного IFileProvider

У меня есть следующий в моем Startup.cs файле:

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

     //etc 
    }); 

Я предположил бы, используя CompositeFileProvider будет означать, что, если файл не найден в одном из поставщиков файлов, то он будет пытаться другим. Я также предполагаю, что поставщик файлов по умолчанию - тот, который я назвал HostingEnvironment.ContentRootFileProvider. Это неверно?

Единственное, что я могу придумать, это то, что проблема возникает из самого моего провайдера в методе GetFileInfo(). Определение которого заключается в следующем:

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); 
} 

Может быть, что возвращение NotFoundFileInfo(subpath) вызывает мои проблемы физической CSS, JS и другие статические файлы? Если да, то что я должен здесь возвращать, чтобы система могла использовать другой поставщик файлов?

ответ

1

OK после того, как немного копания в исходном коде (не так велика, что .NET теперь с открытым исходным кодом ?!), мне удалось найти следующие ссылки были очень полезны в самом деле:

CompositeFileProvider.cs - Based о реализации в GetFileInfo(), я могу видеть, что я должен вернуться обратно null вместо NotFoundFileInfo(subpath), если я хочу, чтобы другие провайдеры попытались решить проблему.

StaticFileMiddleware.cs - Этот файл показывает, что если FileProvider не указан (null) при настройке статической конфигурации файла с app.UseStaticFiles, то он будет решать один с помощью следующей строки кода:

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

И, глядя на Helpers.cs, приведен код:

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

Поэтому мое предположение об использовании HostingEnvironment.ContentRootFileProvider было неверным. Вместо этого я должен использовать HostingEnvironment.WebRootFileProvider.

Все работает так, как должно.