IIS 10 上的 ASP.NET Core 404 错误
Posted
技术标签:
【中文标题】IIS 10 上的 ASP.NET Core 404 错误【英文标题】:ASP.NET Core 404 Error on IIS 10 【发布时间】:2016-07-22 14:35:14 【问题描述】:我遇到了在 IIS 10 上运行的 ASP.NET Core Web 应用程序的问题。 我正在使用 AngularJS 开发单页应用程序。
index.html 加载完美,但后端请求失败,在 IIS 10 上出现 404 错误代码。从带有 IIS Express 的 Visual Studio 中,它可以完美运行。
谁能发现我该如何修复后端请求?
这是我的 Program.cs
public static void Main(string[] args)
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
这是我在 Startup.cs 中的配置方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseIdentity();
// Custom middleware for Angular UI-Router
app.Use(async (context, next) =>
if (!Path.HasExtension(context.Request.Path.Value)
&& context.Request.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest"
&& context.Request.Method.ToUpper() != "POST"
&& context.Request.Method.ToUpper() != "PUT"
&& context.Request.Method.ToUpper() != "DELETE")
await context.Response.WriteAsync(File.ReadAllText(env.WebRootPath + "/index.html"));
await next();
);
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "api/controller=Home/action=Index/id?");
);
【问题讨论】:
启用 ASP.NET Core 日志记录(可能带有调试日志级别)并查看是否有任何消息说明失败的原因 也发布您的 web.config。 你配置好MVC服务了吗? 你是否添加了一个带有 Index 操作的 Home 控制器? 【参考方案1】:在我的情况下,问题是我的控制器抛出了异常,因此框架尝试使用不可用的异常处理程序页面,因此出现 404 错误,控制器本身抛出 500 错误
【讨论】:
您是如何排除故障的 是的,我也有兴趣知道。在开发模式下,异常应该显示在页面上,但事实并非如此。不确定是否存在导致我的 404 的异常 我认为路由由于某种原因被破坏了,如果我包含完整路径,我可以到达 paga,...这将工作 -> localhost:5001/home/index.... 这不会工作 -> localhost:5001/home 既不是这个 localhost:5001 检查这个答案在你的控制器中添加 try catch 语句【参考方案2】:为了搜索者的利益。
我在使用 IIS 时收到 404。我遵循了正确的发布程序 (here) 和详细部署 here。
花了一些时间才弄清楚,但我最终在Rick Strahl blog post 中找到了答案。
基本上,在制作应用程序池并将其设置为“无托管代码”时,我还需要进入高级设置并将应用程序池标识设置为“网络服务”。在我的机器上的 ApplicationPoolIdentity 下很好,但在我部署到的机器上却不行。
所以,为了清楚起见,我的完整程序是:
创建包:
-
创建 dotnet core 网站(我使用 Visual Studio 2017)
发布。本来可以使用 VS 的发布功能,但我通过包管理器使用了 CLR。命令是:
dotnet publish -c Release -r win-x64 --self-contained
我必须使用win-x64 identifier,因为我们必须与 64 位 Windows Server 2008 兼容。
部署:
-
在 C:\inetpub\wwwroot 中创建一个文件夹(例如“testsite”)
获取发布文件夹 (root\bin\Release\netcoreapp2.1\win-x64\publish) 的内容并将其复制到新的“testsite”文件夹(或您的等效文件夹)。
在主机上安装 dotnet core runtime(不是 SDK!)。
打开 IIS。右键单击“应用程序池”,然后单击“添加应用程序池”。创建一个,将 .NET CLR 版本设置为“无托管代码”。
(我的机器不需要这一步,但服务器需要)。再次单击应用程序池。右键单击您的新应用程序池并选择“高级设置”。将身份更改为“网络服务”(如上图所示)。
返回*** IIS,展开“默认网站”,右键单击您网站的文件夹并选择“转换为应用程序”。选择没有托管代码的新应用池。
以管理员身份和
iisreset
打开命令提示符。您应该只在安装 dotnet core 运行时后第一次需要它。
访问网站(例如http://localhost/testsite)
【讨论】:
根据 MSDN 文档,当它独立时,您不需要安装运行时:docs.microsoft.com/en-us/dotnet/core/deploying @Aage - 这是一个很好的观点 - 你不需要它来独立。当然,您仍然需要 .NET Core IIS Hosting Bundle【参考方案3】:您的代码正在使用 Kestrel 在我的机器上运行。一个很好的故障排除步骤是确定问题出在您的 ASP.NET Core 应用程序还是与您的 IIS 托管配置有关。
从项目的根目录试试这个。
dotnet restore
dotnet run
你会看到这样的:
Hosting environment: Production
Content root path: C:\MyApplicationPath
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
在您的浏览器中转到以下两个 URL。如果它们不起作用,则说明您的应用程序有问题。如果它们确实有效,则说明您的 IIS 托管有问题。
localhost:5000 // you will see your index.html page
localhost:5000/api // you will see your default routes output
【讨论】:
谢谢,我可以修复它。问题出在我的应用程序上,但如果应用程序出现问题,抛出 404 错误有点奇怪。 应用程序出了什么问题?您的修复涉及什么? 问题是缺少配置文件。我有 3 个用于开发、登台和生产的环境 appsettings 文件以及必要的连接字符串。默认发布选项仅包含 appsettings.json。所以我需要将值更改为 appsettings*.json 以复制所有环境设置。 非常有用。我的 API 实际上是通过 IIS 并通过在服务器上运行 EXE 来工作的。似乎是我的 Swagger 页面给了我 404。 提到 Swagger 给了我一个想法,我收到了 404 访问 example.com/mysitepoolname,结果我只需要在 example.com/swagger/index.html 访问正确的 URL,瞧,工作得很好。 (希望可以避免浪费时间挖掘解决方案)【参考方案4】:我是 Windows IIS 部署的菜鸟,所以这个答案对某些人来说可能很明显。
我缺少一个密钥文件 - web.config
IIS 需要它来运行您的 Web 应用程序。我使用了这里指定的web.config
配置:
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-5.0
具体来说,ASP.NET Core Module 的配置。
【讨论】:
【参考方案5】:另一个非常愚蠢但可能的变体是,由于错误的部署设置,应用程序部署在与您预期不同的文件夹中(例如:您的服务器根目录而不是子文件夹)。
【讨论】:
【参考方案6】:现在有同样的问题将我带到此页面。如果现在有人遇到这个问题,这就是为我解决的问题:
从https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-aspnetcore-3.1.4-windows-hosting-bundle-installer下载并安装dotnet-hosting-3.1.4-win
从https://dotnet.microsoft.com/download/dotnet-core/2.2下载并安装dotnet-sdk-2.2.207-win-x64
【讨论】:
【参考方案7】:如果您正在使用 api 调用,请确保您的课程具有:
[Route("api/[控制器]")] [ApiController]
在类被实例化的位置之上。
还要确保您拥有: [HttpGet()] 例如上面您尝试调试的 api 方法。
【讨论】:
【参考方案8】:对我来说,问题是一个名为 UrlScan 的 ISAPI 过滤器。我不得不从应用程序中删除它,然后它才起作用。
【讨论】:
以上是关于IIS 10 上的 ASP.NET Core 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误
从 IIS 上的 ASP.NET Core 应用程序请求超时
IIS 上的 Asp.net Core 2 发布项目只返回一个空白页?