【实战】使用 VS 2019 将项目发布到远程 IIS 服务器


在以往发布项目的时候,都是将文件复制粘贴到站点目录,或者通过ftp上传到站点目录,现在随着持续集成、自动化运维、自动化发布的出现,发布项目也在日新月异。

本文介绍,如何通过 vs 2019 远程发布到远程 iis 站点下。

远程服务器系统:Windows Server 2019 64 位

服务器配置

1.添加 iis,安装 .net 框架(略)

2.下载安装 Web Deploy

Web Deploy 可以用于本地和远程部署Web项目,地址:https://www.iis.net/downloads/microsoft/web-deploy



在安装的时候,选择“完整”安装,安装完成后,会在服务中看到“Web Management Service”服务,如下图:



如果未安装,在远程发布的时候,vs 会报错如下:

---------------------------
Microsoft Visual Studio
---------------------------
未能连接到远程计算机(“xx”)。请确保在远程计算机上安装了 Web Deploy 并启动了所需的进程(“Web Management Service”)。  在以下位置了解更多信息: https://go.microsoft.com/fwlink/ ... ATION_NOT_REACHABLE。 无法连接到远程服务器
---------------------------
确定   
---------------------------

3.安装“IIS 管理脚本和工具”

转到“选择服务器角色” > “Web 服务器(IIS)” > “管理工具”,然后选择“IIS 管理脚本和工具”角色,点击“下一步”,然后安装角色 。



4.IIS 启用远程连接

在 IIS 找到管理服务,启用远程连接,如下图:





(备注:在防火墙和安全组要开放8172入站端口

5.新建 IIS 站点

新建一个名称为 test1 的站点,如下图:



6.IIS 添加管理用户

添加 IIS 管理器用户,如下图:

 

同时,在 test1 站点,添加授权,如下图:

 

如果未添加授权,在远程发布的时候,会报错如下:

---------------------------
Microsoft Visual Studio
---------------------------
已使用 Web 管理服务连接到远程计算机(“xxx”),但未能授权。请确保你使用了正确的用户名和密码、你连接的站点已存在并且凭据代表的用户有权访问该站点。  在以下位置了解更多信息: https://go.microsoft.com/fwlink/ ... R_USER_UNAUTHORIZED。 远程服务器返回错误: (401) 未经授权。
---------------------------
确定   
---------------------------

发布 ASP.NET MVC 项目

首先,使用 vs 2019 新建一个 .NET 4.6.2 的 asp.net mvc 项目,名称为:WebAutomatedDeployment,

再新建两个类库,网站程序同时引用这2个类库。(新建和引用2个类库,原因是模拟更接近正式的项目)


尝试启动项目,如下图:



右击项目,选择发布,web服务器(iis)->web部署,填写服务器信息,如下图:

  

验证连接,测试通过,如下图:

 


尝试发布的时候,报错如下:

Web 部署任务失败。((2020/10/9 11:34:38)在远程计算机上处理请求时出错。)

(2020/10/9 11:34:38)在远程计算机上处理请求时出错。
服务器在处理请求时遇到问题。请与服务器管理员联系以了解详细信息。        WebAutomatedDeployment                0

可以通过服务器事件查看器查看具体的错误,如下图:

User: itsvse
Client IP: xxx
Content-Type: application/msdeploy
Version: 9.0.0.0
MSDeploy.VersionMin: 7.1.600.0
MSDeploy.VersionMax: 9.0.3802.0
MSDeploy.Method: Sync
MSDeploy.RequestId: def8d9f7-1a72-4b19-8b75-919f8c6a9604
MSDeploy.RequestCulture: zh-CN
MSDeploy.RequestUICulture: zh-CN
ServerVersion: 9.0.1973.0
Skip: objectName="^configProtectedData$"
Provider: auto, Path:
发生了传播到客户端的跟踪部署代理异常。请求 ID“def8d9f7-1a72-4b19-8b75-919f8c6a9604”,请求时间戳:“2020/10/9 11:51:29”。错误详细信息:
System.UnauthorizedAccessException: 尝试执行未经授权的操作。
   在 System.Security.AccessControl.Win32.SetSecurityInfo(ResourceType type, String name, SafeHandle handle, SecurityInfos securityInformation, SecurityIdentifier owner, SecurityIdentifier group, GenericAcl sacl, GenericAcl dacl)
   在 System.Security.AccessControl.NativeObjectSecurity.Persist(String name, SafeHandle handle, AccessControlSections includeSections, Object exceptionContext)
   在 System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections, Object exceptionContext)
   在 Microsoft.Web.Deployment.FileSystemSecurityEx.Persist(String path, Boolean isFile)
   在 Microsoft.Web.Deployment.SetAclProvider.Add(DeploymentObject source, Boolean whatIf)
   在 Microsoft.Web.Deployment.DeploymentObject.Update(DeploymentObject source, DeploymentSyncContext syncContext)
   在 Microsoft.Web.Deployment.DeploymentSyncContext.HandleUpdate(DeploymentObject destObject, DeploymentObject sourceObject)
   在 Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenOrder(DeploymentObject dest, DeploymentObject source)
   在 Microsoft.Web.Deployment.DeploymentSyncContext.ProcessSync(DeploymentObject destinationObject, DeploymentObject sourceObject)
   在 Microsoft.Web.Deployment.DeploymentObject.SyncToInternal(DeploymentObject destObject, DeploymentSyncOptions syncOptions, PayloadTable payloadTable, ContentRootTable contentRootTable, Nullable`1 syncPassId, String syncSessionId)
   在 Microsoft.Web.Deployment.DeploymentAgent.HandleSync(DeploymentAgentAsyncData asyncData, Nullable`1 passId, String user, String siteName)
   在 Microsoft.Web.Deployment.DeploymentAgent.HandleRequestWorker(DeploymentAgentAsyncData asyncData)
   在 Microsoft.Web.Deployment.DeploymentAgent.HandleRequest(DeploymentAgentAsyncData asyncData)

解决方案:

重新启动 vs 工具,点击发布,会弹出如下图:



勾选“为Visual Studia的将来会话保存此证书”即可解决。

第一次发布的时候,比较慢,因为需要将全部的文件上传到服务器,如下图:



尝试修改 Index.cshtml 页面文件,点击重新发布,只会更新如下3个文件,如下图:



刷新网站,发现已经更新,如下图:

最后,附上个人阅读量超1200万的博客:https://www.itsvse.com/blog_xzz.html

(完)