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

时间:2017-09-11 17:33:24

标签: c# css asp.net-core .net-core

编辑:添加了红隼

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

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

我已按照here步骤启用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?}");
    });
}

10 个答案:

答案 0 :(得分:17)

我尝试了很多无用的东西,这对我来说是个解决方法:

@OnClick(R.id.id1, R.id.id2)
 fun onClick(view: View) {
        when (view.id) {

            R.id.id1 -> {}
            R.id.id2 -> {}
            else ->{}
       }
}

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

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

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

答案 1 :(得分:10)

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

  1. md static-test
  2. cd static-test
  3. dotnet new web
  4. 在wwwroot中添加文件夹css
  5. site.css
  6. 中添加文件wwwroot/css
  7. app.UseStaticFiles();方法的开头插入Startup.Configure()
  8. dotnet publish -o pubweb
  9. cd pubweb
  10. dotnet。\ static-test.dll
  11. 使用浏览器访问http://localhost:5000/css/site.css
  12. 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文件。请尝试上述步骤,并将代码和输出与失败的项目进行比较。如果仍然失败,请附上上面Request的{​​{1}}与Physical路径的调试信息。

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

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

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

我使用开发中的wwwroot文件夹,因此不必确保所有新项目都已添加到“复制到输出目录”中。

答案 5 :(得分:1)

我已使用MS模板使用asp.net核心 2.1 (MVC)创建了一个新项目,然后添加了带有某些动画的css文件 animate.css

要使用它,必须在 _Layout.cshtml
中添加 href 因此,我注意到,MS已“忘记”添加环境“登台”和“生产” 因此..如果在“开发”环境中添加了href,则一切都可以在调试(IIS Express)中正常工作,但是它不能与自托管服务器一起使用(我也假设不在“真正的” IIS上),因为不是开发环境,并且在运行时未设置
因此,我已经复制粘贴了“开发”环境,也用于“登台”和“生产”(请参见下面的摘录)。

  <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
        <link rel="stylesheet" href="~/css/animate.css">
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>

    @*<environment include="Staging,Production"> -> was missing completely!copy pasted from Development*@
    <environment include="Staging,Production">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
        <link rel="stylesheet" href="~/css/animate.css">
    </environment>
    <environment exclude="Staging,Production">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
    @*End manually inserted*@

答案 6 :(得分:0)

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

<environment include="Development">
</environment>

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

答案 7 :(得分:0)

如果您在Docker中遇到此问题,则需要知道“ root”是基于您执行dotnet命令的位置。我不确定这是否最有意义,但事实就是如此。容易被绊倒的地方是您需要在执行命令之前确保Docker容器在正确的目录中。

WORKDIR /app
# Example publish/build command:
RUN dotnet publish -o out
# Your publish folder is /app/out so...
# ENTRYPOINT ["dotnet", "/app/out/myapp.dll"]
# will run but you'll get 404s on all your static content. 
# Instead use:
WORKDIR /app/out
ENTRYPOINT ["dotnet", "myapp.dll"]

请勿将我的脚本用作适当的Docker发布脚本的示例。这只是一个例子。

答案 8 :(得分:0)

我有一个类似的问题。 (以防万一,我用Win开发并托管在Linux上)。仅有几个文件有效(大多数是默认文件),但我自己的内容导致404。

罪魁祸首是:文件名和文件夹名中的大写字母对我不起作用。 一切都转换为小写,并且可以正常工作。

答案 9 :(得分:0)

在.NET Core 2.2 MVC中,使用“本地系统”用户将其作为独立的Windows服务运行时,也遇到了同样的问题。

问题在于Windows服务使用“ C:\ Windows \ System32”中的默认目录,因此您需要定义新路径:

 let filePath = "/Users/UserName/Desktop/FolderName/FileName.txt"
 let fullPath = NSString(string: filePath).expandingTildeInPath
 do
 {
     let fileContent = try NSString(contentsOfFile: fullPath, encoding: String.Encoding.utf8.rawValue)
     print(fileContent)
 }
 catch
 {
     print(error)
 }

这是我在运行时用于检测路径的代码:

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