IIS 10上的ASP.NET Core 404错误

Mat*_*abo 19 c# asp.net iis asp.net-core asp.net-core-1.0

我在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();
}
Run Code Online (Sandbox Code Playgroud)

这是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?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

moh*_*has 21

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

  • 你是如何排除故障的 (6认同)
  • 是的,我也有兴趣知道。在开发模式下,异常应该显示在页面上,但事实并非如此。不确定是否有异常导致我的 404 (2认同)
  • 我认为路由由于某种原因被破坏了,如果我包含完整路径,我可以到达 paga,...这将起作用 -&gt; https://localhost:5001/home/index...这不会工作-&gt; https://localhost:5001/home 这两个都不是 https://localhost:5001/ (2认同)

Sha*_*tin 13

您的代码正在使用Kestrel在我的机器上运行.一个很好的故障排除步骤是找出问题是与您的ASP.NET核心应用程序或IIS主机配置有关.

从项目的根目录中尝试这个.

dotnet restore
dotnet run
Run Code Online (Sandbox Code Playgroud)

你会看到这样的东西:

Hosting environment: Production
Content root path: C:\MyApplicationPath
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Run Code Online (Sandbox Code Playgroud)

在浏览器中,转到以下两个URL.如果它们不起作用,那么您的应用程序就会出现问题.如果它们确实有效,那么IIS主机就会出现问题.

localhost:5000        // you will see your index.html page
localhost:5000/api    // you will see your default routes output
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我可以解决它.问题出在我的应用程序上,但如果应用程序出现问题则抛出404错误有点奇怪. (2认同)

Hoc*_*eyJ 7

为了搜索者的利益。

使用IIS时出现404错误。我曾跟随用于发布(正确的程序在这里,详细)和部署在这里

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

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

在此处输入图片说明

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

创建包:

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

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

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

部署:

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

  • @Aage - 这是一个很好的观点 - 你不需要它来实现自给自足。当然,您仍然需要 .NET Core IIS Hosting Bundle (2认同)

小智 7

就我而言,通过在 web.config 中设置环境变量解决了问题

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile=".\logs\stdout"
      hostingModel="inprocess">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
     </environmentVariables>
</aspNetCore>
Run Code Online (Sandbox Code Playgroud)


Reb*_*_87 5

我缺少一个密钥文件 - web.configIIS 需要该文件才能运行您的 Web 应用程序。我使用了web.config此处指定的配置:

https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-5.0

具体来说,是 ASP.NET Core 模块的配置。