关于IIS 10上的c#:ASP.NET Core 404错误

ASP.NET Core 404 Error on IIS 10

我在IIS 10上运行的ASP.NET Core Web应用程序有问题。
我正在使用AngularJS开发单页应用程序。

index.html完美加载,但后端请求在IIS 10上失败,并显示404错误代码。从带有IIS Express的Visual Studio,它可以完美运行。

谁能发现我该如何解决后端请求?

这是我的Program.cs

1
2
3
4
5
6
7
8
9
10
11
public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

这是我来自Startup.cs的Configure方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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?}");
    });
}


在我的情况下,问题是我的控制器抛出了异常,因此框架尝试使用不可用的异常处理程序页面,因此出现404错误,控制器本身抛出了500错误


为了搜索者的利益。

使用IIS时出现404错误。我已按照此处详细说明的正确步骤进行发布(此处)和部署。

花了一些时间才弄清楚,但我最终在Rick Strahl的博客文章中找到了答案。

基本上,在制作应用程序池以及将其设置为"无托管代码"时,我还需要进入高级设置并将应用程序池标识设置为"网络服务"。在我的机器上的ApplicationPoolIdentity下很好,但是在我部署到的机器上却没有。

enter image description here

因此,为清楚起见,我的整个过程是:

创建包:

  • 创建dotnet核心网站(我使用了Visual Studio 2017)
  • 发布。可以使用VS的发布功能,但是我通过包管理器使用了CLR。命令是:

    dotnet发布-c发布-r win-x64-自包含

  • 我必须使用win-x64标识符,因为我们必须与64位Windows Server 2008兼容。

    部署:

  • 在C:\ inetpub \ wwwroot中创建一个文件夹(例如'testsite')
  • 取得发布文件夹({root} \ bin \ release \ netcoreapp2.1 \ win-x64 \ publish)的内容,并将其复制到新的" testsite"文件夹(或等效文件夹)。
  • 在主机上安装dotnet core运行时(不是SDK!)。
  • 打开IIS。右键单击"应用程序池",然后单击"添加应用程序池"。创建一个.NET CLR版本设置为"无托管代码"的文件。
  • (我的机器不需要此步骤,但是服务器需要此步骤。)再次单击"应用程序池"。右键单击新的应用程序池,然后选择"高级设置"。将身份更改为"网络服务"(如上图所示)。
  • 返回顶级IIS,展开"默认网站",右键单击您的网站文件夹,然后选择"转换为应用程序"。选择没有托管代码的新应用程序池。
  • 以admin和iisreset身份打开命令提示符。在安装dotnet core运行时之后,仅应在第一次时才需要此功能。
  • 访问该网站(例如http:// localhost / testsite)

  • 您的代码正在使用Kestrel在我的机器上工作。一个很好的疑难解答步骤是找出问题出在ASP.NET Core应用程序还是IIS主机配置。

    从您的项目的根开始尝试。

    1
    2
    dotnet restore
    dotnet run

    您将看到如下内容:

    1
    2
    3
    4
    Hosting environment: Production
    Content root path: C:\\MyApplicationPath
    Now listening on: http://localhost:5000
    Application started. Press Ctrl+C to shut down.

    在浏览器中,转到以下两个URL。如果它们不起作用,则您的应用程序有问题。如果它们确实起作用,则说明您的IIS托管出现了问题。

    1
    2
    localhost:5000        // you will see your index.html page
    localhost:5000/api    // you will see your default routes output


    现在遇到了同样的问题,这使我进入了此页面。如果现在有人遇到这个问题,这就是为我解决的问题:

  • 从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


  • 另一个非常愚蠢但很可能的变体是,由于错误的部署设置,该应用程序部署在与您期望的文件夹不同的文件夹中(例如:服务器根目录而不是子文件夹)。


    对我来说,问题是一个名为UrlScan的ISAPI筛选器。我必须将其从应用程序中删除,然后才起作用。


    如果您使用的是api调用,请确保您的课程具有:

    [Route(" api / [controller]")]
    [ApiController]

    上面的类被实例化的地方。

    还要确保您具有:
    [HttpGet()]
    例如在您要调试的api方法上方。