我做的第一件事是在 IIS 服务器上安装 .NET Core Hosting Bundle;我也停止并重新启动了 IIS;
我已经测试并且可以确认我的应用程序在 Krestel 上运行,但我正在努力让它在 IIS 中运行(进程内);
与 Krestel 一起跑步(好/通过):
在我的本地 PC 上,“发布”为依赖于框架的 MyAppFolder(此文件夹现在包含我的应用程序的所有已编译资产,包括 exec 和 dll 的)
将 MyAppFolder 移动到 IIS 服务器上的某处;
直接在命令行上运行可执行文件(MyWebApi.exe),我得到默认的Now Listening on:http://localhost:5000
如果我使用浏览器导航到端点 http://localhost:5000/MyResource/123 ,则此 GET 请求会产生所需的 json 结果;
使用 IIS 运行(错误/失败):
- 如上所述,已安装 NET Core Hosting Bundle,包括停止/启动 iis 服务器
- 创建了一个应用程序池(无托管代码)
- 在 IIS 管理器 (MyVirtualApp) 上创建了一个虚拟应用程序,它指向包含我的应用程序所有资产的文件夹(与 Krestel 一起使用的同一文件夹)
我认为应该是这样,但它不起作用?我错过了任何步骤吗?当我将浏览器指向我的资源 http://localhost/MyVirtualApp/MyResource/123 时,我得到一个 404!
附加信息:
//Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
文档说我不需要显式 UseIIS
,因为 CreateDefaultBuilder 将使用 IIS 或 Krestel;
此外, dotnet --info 给出以下内容:
Host (useful for support):
Version: 5.0.17
Commit: 6a98414363
.NET SDKs installed:
No SDKs were found.
.NET runtimes installed:
Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download
404 错误页面:(由 IIS 给出)
Detailed Error Information:
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
此 IIS 错误似乎与路由有关,https://stackoverflow.com/questions/5677099/routing-http-error-404-0-0x80070002
回答1
事实证明,Visual Studio 中的“发布”向导生成的“目标文件夹”会生成一个父文件夹,其中包含我的应用程序的 exe 和 dll,以及名为 publish、ref、runtimes 的子子文件夹;
在 IIS 中,我将站点的物理路径配置为父文件夹级别,而它应该是发布文件夹! (我认为 MS 的团队没有理由在父文件夹中生成文件,并再次在发布文件夹中生成文件 - 为什么要加倍并让它变得混乱!)。