Asp.Net Core 2.0 Kestrel不提供静态内容

编辑:添加了红隼

使用IIS express运行Asp.Net Core 2.0应用程序时,静态文件(css,js)按预期提供。 但是,当通过“dotnet publish -o [targetDirectory]”和dotnet [website.dll]使用命令行/ Kestrel时,Kestrel不会提供任何静态内容。 利用浏览器F12,我看到Kestrel返回404错误。 仔细观察,当直接在浏览器中输入文件路径(localhost:5000 / css /cssfile.css)时,文件不会显示,但浏览器似乎重定向到“localhost:5000 / cssfile.css”,但仍然返回404错误(注意缺少的/ css /目录)。

我通过Visual Studio 2017创建了这个项目,并为新的MVC Core 2.0应用程序选择了默认值(安装了SDK)。

我已按照此处的步骤在 program.cs和startup.cs文件中启用静态文件。 这些实现“app.UseStaticFiles();” 和“.UseContentRoot(Directory.GetCurrentDirectory())”。 通过谷歌找到的文章似乎都没有帮助。 我已经validation了dotnet将静态内容复制到目标目录。

我错过了什么? 谢谢

// Program.cs public static IWebHost BuildWebHost(string[] args) => WebHost .CreateDefaultBuilder(args) .UseStartup() .Build(); // Startup.cs public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseExceptionHandler("/Error/HandleError"); app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=User}/{action=Index}/{id?}"); }); } 

我无法使用新的ASP.NET Core 2.0项目按照这些步骤重现您的错误;

  1. md静态测试
  2. cd静态测试
  3. dotnet新网站
  4. 在wwwroot中添加文件夹css
  5. wwwroot/css添加文件site.css
  6. 插入app.UseStaticFiles();Startup.Configure()方法的开头。
  7. dotnet发布-o pubweb
  8. cd pubweb
  9. dotnet。\ static-test.dll
  10. 使用浏览器访问http:// localhost:5000 / css / site.css 。

dotnet.exe在我的终端中呈现以下输出:

 Hosting environment: Production Content root path: C:\src\static-test\pubweb Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Request starting HTTP/1.1 GET http://localhost:5000/css/site.css info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2] Sending file. Request path: '/css/site.css'. Physical path: 'C:\src\static-test\pubweb\wwwroot\css\site.css' 

如您所见,它将成功正确地在子文件夹中提供css文件。 请尝试上述步骤,并将代码和输出与失败的项目进行比较。 如果仍然失败,请在上面的Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware上附上Request vs. Physical路径上的调试信息。

我尝试了很多无用的东西,这是我的修复:

 WebHost.CreateDefaultBuilder(args) .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .UseWebRoot("E:\\xyz\\wwwroot") .UseUrls("http://localhost:5050") .Build(); 

我添加后,服务静态文件就开始工作了:

 .UseWebRoot("E:\\xyz\\wwwroot") 

我在其中一个运行在端口5000上的服务器上发生了冲突,所以我指定从端口5050开始。

我刚遇到一个非常类似的问题。 我无法让Kestrel提供任何静态内容; 我有一个在.net核心1.1中运行良好的配置,但它在.net core 2.0中不起作用。

我通过它调试,静态文件中间件使用的IFileProvider实例是NullFileProvider。 我必须在Startup.cs中执行此操作以获取静态内容:

 app.UseFileServer( new FileServerOptions() { FileProvider = new PhysicalFileProvider("some_path") }); 

请检查以下标签中是否存在这些静态文件。

   

如果已发布,如果静态文件存在于include Development ,则它们将不会出现在Published文件夹中。 此外,检查View Source并查看这些链接是否存在。

经过反复试验后,我意识到一旦我开始使用Kestrel,静态文件web root就会突然映射到bin文件夹而不是开发文件夹。 要解决此问题,您可以执行以下两项操作之一。

  1. 您可以将要包括的所有静态文件设置为“复制到输出目录”
  2. 您可以将根目录重新映射到某个路径:

     .UseKestrel(...) .UseWebRoot(@"C:\MyProject\wwwroot\"); 

我使用我开发的wwwroot文件夹,所以我不必确保将所有新项目添加到Copy to Output Directory。

对我来说,问题是工作目录。 当我尝试使用dotnet /var/www/project/project.dll启动应用程序时,我没注意到我所在的目录。 当您以这种方式启动应用程序时,它会自动使用您当前的目录作为工作目录。

当我查看另一个项目的.service文件时,我意识到了这一点,该项目具有指定的WorkingDirectory:

 ... WorkingDirectory=/var/www/project/ ExecStart=/usr/bin/dotnet /var/www/project/project.dll ... 

因此,要么在运行项目时确保您位于正确的目录中,要么确保在.service文件中正确设置了WorkingDirectory。