我在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?}");
});
}
9条答案
按热度按时间pgky5nke1#
在我的例子中,问题是我的控制器抛出了一个异常,因此框架试图使用不可用的异常处理程序页面,因此出现了404错误,控制器本身抛出了500错误
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)
lsmd5eda3#
您的代码在我的机器上使用Kestrel工作。一个很好的故障排除步骤是找出问题是出在ASP.NET核心应用程序上还是出在IIS宿主配置上。
请从项目的根目录尝试执行此操作。
您将看到如下所示的内容:
在你的浏览器中,进入以下两个URL。如果它们不起作用,那么你的应用程序有问题。如果它们起作用,那么你的IIS主机有问题。
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核心模块的配置。
wydwbb8l5#
另一个非常愚蠢但可能的变体是应用程序部署在与您预期的文件夹不同的文件夹中(例如:您的服务器根目录而不是子文件夹)。
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
hl0ma9xz7#
如果您正在使用API调用,请确保您的类具有:
[路由(“api/[控制器]”)] [ApiController]
上面示例化类的位置。
此外,请确保您拥有:[HttpGet()]例如,在您尝试两柴的api方法上方。
368yc8dk8#
在我的例子中,这个问题是通过在web.config中设置环境变量来解决的
aydmsdu99#
对我来说,问题是一个名为UrlScan的ISAPI过滤器。我不得不从应用程序中删除它,只有这样它才能工作。