编辑:添加了红隼
使用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?}");
});
}
答案 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项目重现您的错误;
css
。site.css
。wwwroot/css
app.UseStaticFiles();
方法的开头插入Startup.Configure()
。 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文件夹。要解决此问题,您可以执行以下两项操作之一。
您可以将根目录重新映射到某个路径:
.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\");