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

dav*_*459 9 css c# .net-core asp.net-core

编辑:添加了红隼

使用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())".通过谷歌找到的文章似乎都没有帮助.我已经验证了dotnet将静态内容复制到目标目录.

我错过了什么?谢谢

// Program.cs
public static IWebHost BuildWebHost(string[] args) => WebHost
   .CreateDefaultBuilder(args)
   .UseStartup<Startup>()
   .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?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*son 18

我尝试了很多无用的东西,这对我来说是个问题:

WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseWebRoot("E:\\xyz\\wwwroot")
.UseUrls("http://localhost:5050")
    .Build();
Run Code Online (Sandbox Code Playgroud)

我添加时,服务静态文件开始工作:

.UseWebRoot("E:\\xyz\\wwwroot")
Run Code Online (Sandbox Code Playgroud)

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


joa*_*del 10

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

  1. md static-test
  2. cd static-test
  3. dotnet new web
  4. css在wwwroot中添加文件夹.
  5. 添加文件site.csswwwroot/css.
  6. app.UseStaticFiles();Startup.Configure()方法的开头插入.
  7. dotnet publish -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'
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

...
WorkingDirectory=/var/www/project/
ExecStart=/usr/bin/dotnet /var/www/project/project.dll
...
Run Code Online (Sandbox Code Playgroud)

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