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下很好,但是在我部署到的机器上却没有。
因此,为清楚起见,我的整个过程是:
创建包:
发布。可以使用VS的发布功能,但是我通过包管理器使用了CLR。命令是:
dotnet发布-c发布-r win-x64-自包含
我必须使用win-x64标识符,因为我们必须与64位Windows Server 2008兼容。
部署:
您的代码正在使用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方法上方。