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 发布项目只返回一个空白页?

将 ASP NET Core 部署到 IIS

IIS 错误 502.5 上的 ASP.NET Core 1.0

ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境