一、在Visual Studio里发布
右键点击WebApi工程,点击发布按钮,如下图所示。

点击【发布】按钮后,系统弹出发布对话框,如下图所示。

选择文件夹,点击【下一步】。

在该界面选择发布输出的目录,一般默认即可,发布到IIS时,我们把此处的文件再拷贝实际在IIS上发布的目录。然后点击【完成】按钮。

在该界面点击【关闭】按钮。Visual Studio会显示如下界面。

点击【显示所有设置】按钮,弹出的设置对话框如下图所示。

【配置】项包含Debug和Release,我们发布的话,选择Release即可。
【目标框架】选择.net9.0。
【部署模式】包括框架依赖和独立两种,如果选择独立,会把依赖的.Net 9.0的dll文件也会拷贝到发布目录下,我们是把Web API发布到IIS上,我们会部署好.net 9.0的环境,所以这里设置框架依赖即可。
【目标运行时】用来设置发布的目标,包括win-x86、win-x64、win-arm、win-arm64、osx-x64、osx-arm64linux-x64、inux-arm、linux-arm64多个目标平台,根据自己的需求选择。我们要发布到Windows的IIS上,选择win-x64即可。
【生成单个文件】,勾选可把所有的文件打包成一个exe文件,我一般不勾选该项,实际效果未做过测试。
【启用 ReadyToRun 编译】,是一种 AOT(Ahead-of-Time)预编译技术,它通过将 IL(中间语言)代码预先编译为本机机器码,显著提升应用程序的启动性能和运行时效率。可根据自己的实际情况选择是否勾选。
【裁剪未使用的代码】,通过静态分析移除应用程序中未使用的代码(如未引用的程序集、类型、方法等)来优化应用体积。对体积大小敏感的程序可勾选该选项。例如MAUI开发的移动端程序,Blazor程序等,这样通过删除未被执行的代码(如未使用的库、反射未触及的类型),可显著减小应用程序包大小。WebAPI是发布到服务器端的程序,该选项勾不勾选都可以。
【在发布前删除所有现有文件】作用是 清空目标发布目录中的所有旧文件,确保发布过程在一个干净的环境中进行,避免残留文件干扰新版本的部署。建议勾选。
【数据库】项目基本上不用,数据库一般我们都会独立的部署。
设置完这些参数后,点击【保存】按钮。此时该对话框关闭,新的设置显示到visual Studio界面上,如下图所示。

点击右上角的【发布】按钮,执行发布操作。发布成功后,Visual Studio的界面如下图所示。

点击【目标位置】项右侧的路径链接,可以快速定位到发布的目录。如下图所示。

把该目录下的所有文件,都拷贝到我们要发布的目录下。下一步就可以在IIS中发布了。
二、在IIS中发布
首先我们要安装环境,如果没有IIS的话,可以搜索把IIS启用的方法,启用IIS即可。我们主要说下安装.net 9.0 在IIS下的运行环境安装。
通过https://dotnet.microsoft.com/zh-cn/download/dotnet/9.0可以进入.net 9.0的各开发包和运行环境的下载页面,如下图所示。

我们选择下载【ASP.NET Core 运行时】,因为我们是部署到IIS上,所以选择Windows那一栏中的【Hosting Bundle】,这个安装包专为 IIS 部署设计,集成以下组件:ASP.NET Core 运行时、.NET 运行时和IIS 模块(ANCM - AspNetCoreModule)。如果要部署到Nginx等环境下,可下载X64版本。
下载后,直接双击,按照提示默认安装即可。安装后,重启一下IIS。
打开IIS,点击到根节点,然后在右侧双击【模块】按钮。如下图所示。

弹出的模块内容如下图所示。

如果包含了【AspNetCoreModuleV2】项,基本上就可以认为是安装成功了。
右键点击【应用程序池】,点击【新建应用程序池】弹出对话框如下图所示。

【名称】可根据自己需要命名,建议可以和发布的项目名称保持一致。【.NET CLR 版本】选择无托管代码,其他保持默认设置即可。最后点击【确定】按钮,完成程序池的新建工作。
右键点击【网站】节点,在弹出的右键菜单中点击【新建网站】按钮,弹出【新建网站】对话框。如下图所示。

输入网站的名称,选择程序池,设置发布程序存储的路径,并设置好端口,点击确定即可,此时该网站就会添加到IIS中。如下图所示。

选中刚发布的WebAPI,点击右侧的浏览按钮,可以在浏览器中测试是否可以查看。默认是访问不到任务信息,会显示HTTP ERROR 404错误。可以直接测试某个API或则打开Swagger页面,如果能打开则发布成功。但正是发布的时候,要禁用Swagger。

三、发布的时候的一些注意事项:
1、发布的网站名称和使用的程序池名称尽量保持一致,并且创建的时候一次性命名,如果命名错误,不要修改,直接删除,重新创建。这样可能会避免一些错误。(原因没有深究,只是平常使用的时候经常遇到这样的问题)
2、程序池的启动模式可以修改为AlwaysRunning,就是一直运行,另外一个设置是当第一次请求的时候才启动。
3、发布的内容所在的目录给其最高权限,例如给Everyone所有的权限等。