IIS 10上的ASP.NET核心404错误

txu3uszq  于 2022-11-12  发布在  .NET
关注(0)|答案(9)|浏览(228)

我在IIS10上运行ASP.NET核心Web应用程序时遇到了问题。我正在用AngularJS开发一个单页应用程序。
index.html加载正常,但后端请求在IIS 10上失败,错误代码为404。在Visual Studio和IIS Express中,它工作正常。
有人能看出我如何修复后端请求吗?
这是我的程序. cs

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

这是我在Startup.cs中使用的Configure方法

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?}");
    });
}
pgky5nke

pgky5nke1#

在我的例子中,问题是我的控制器抛出了一个异常,因此框架试图使用不可用的异常处理程序页面,因此出现了404错误,控制器本身抛出了500错误

fhg3lkii

fhg3lkii2#

为了搜索者的利益。
我在使用IIS时得到了404。我遵循了正确的发布(here)和部署过程,如详细的here
花了一些时间才弄清楚,但我最终在里克·斯特拉尔的一篇博客文章中找到了隐藏的答案。
基本上,当创建应用程序池并将其设置为“无托管代码”时,我还需要进入高级设置,并将应用程序池标识设置为“网络服务”。在我的机器上的ApplicationPoolIdentity下,这是正常的,但在我部署到的机器上就不行了。

所以,为了清楚起见,我的完整程序是:
若要建立封装:
1.创建dotnet核心网站(我使用的是Visual Studio 2017)
1.发布。本可以使用VS的发布功能,但我通过包管理器使用了CLR。命令是:
dotnet publish -c Release -r win-x64 --自包含
我不得不使用win-x64 identifier,因为我们必须与64位Windows Server 2008兼容。
要部署:
1.在C:\inetpub\wwwroot中创建一个文件夹(例如“testsite”)
1.获取发布文件夹({root}\bin\Release\netcoreapp 2.1\win-x64\publish)的内容,并将其复制到新的“testsite”文件夹(或等效文件夹)。
1.在主机上安装dotnet核心runtime(不是SDK!)。
1.开启IIS。以鼠标器右击按一下[应用程序集区],然后按一下[新增应用程序集区]。建立一个.NET CLR版本设定为[无Managed程式码]的应用程序集区。
1.(我的计算机不需要此步骤,但服务器需要)。再次单击应用程序池。右键单击新的应用程序池并选择“高级设置”。将标识更改为“网络服务”(如上图所示)。
1.回到最上层IIS,展开[预设网站],以鼠标器右击按一下您网站的文件夹,然后选择[转换成应用程序]。选择不含Managed程式码的新应用程序集区。
1.以admin和iisreset的身份打开命令提示符。您应该只在第一次安装dotnet核心运行时时才需要此命令。
1.访问网站(例如http://localhost/testsite

lsmd5eda

lsmd5eda3#

您的代码在我的机器上使用Kestrel工作。一个很好的故障排除步骤是找出问题是出在ASP.NET核心应用程序上还是出在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
gwo2fgha

gwo2fgha4#

我是一个新手与windows IIS部署,所以这个答案可能似乎是显而易见的一些人。
我缺少IIS运行您的Web应用程序所需的密钥文件-web.config。我使用了此处指定的web.config配置:
https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-5.0
特别是ASP.NET核心模块的配置。

wydwbb8l

wydwbb8l5#

另一个非常愚蠢但可能的变体是应用程序部署在与您预期的文件夹不同的文件夹中(例如:您的服务器根目录而不是子文件夹)。

jv2fixgn

jv2fixgn6#

有同样的问题,现在把我带到这个页面。如果有人有这个问题,现在这是什么修复了我:
1.已从https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-aspnetcore-3.1.4-windows-hosting-bundle-installer下载并安装dotnet-hosting-3.1.4-win
1.已从https://dotnet.microsoft.com/download/dotnet-core/2.2下载并安装dotnet-sdk-2.2.207-win-x64

hl0ma9xz

hl0ma9xz7#

如果您正在使用API调用,请确保您的类具有:
[路由(“api/[控制器]”)] [ApiController]
上面示例化类的位置。
此外,请确保您拥有:[HttpGet()]例如,在您尝试两柴的api方法上方。

368yc8dk

368yc8dk8#

在我的例子中,这个问题是通过在web.config中设置环境变量来解决的

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile=".\logs\stdout"
      hostingModel="inprocess">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
     </environmentVariables>
</aspNetCore>
aydmsdu9

aydmsdu99#

对我来说,问题是一个名为UrlScan的ISAPI过滤器。我不得不从应用程序中删除它,只有这样它才能工作。

相关问题