解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线,自动部署到Azure App Service以后,.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。

640?wx_fmt=png

查找问题

首先,幸好,这是个staging环境。爆了以后,我发现网站竟然没有log,连log的目录都找不到,这非常奇怪。于是我决定在Azure启用开发模式,让网站输出详细错误信息。熟悉经典ASP.NET的同学可能知道,只要在web.config里设置个customError就行了。但是.NET Core没有这个东西,怎么办呢?我教大家一个猥琐小技巧:

.NET Core的设置,是优先用环境变量覆盖的。所以我们可以利用这点,在Azure App Service的设置里加这么一个环境变量:

ASPNETCORE_ENVIRONMENT:Development

640?wx_fmt=png

更改设置的地方在Application settings页面

朋友们可能会问:我怎么知道这个值的?其实这个设置来源于Visual Studio

640?wx_fmt=png

打开开发模式以后,输出了宇宙大爆炸的详细信息:

640?wx_fmt=png

发现执行的代码路径竟然不是在App Service应有的网站根目录!于是我的代码找不到依赖项,就爆了。

怎么回事

我尝试了手动从VS部署,也是爆的。在Azure DevOps重新部署,也是爆的。甚至停用CD管线,用kudu直接build git的代码,也是爆的!我陷入了循环懵逼:

640?wx_fmt=gif

最终我删除并重建了一个新的App Service实例,用VS发布,居然就好了。但是我再次用CI/CD管线部署以后,又产生了大爆炸。细心的我,保留了网站运行正常时候的配置信息,与爆炸以后的配置对比发现,是多了这么一个设置:

640?wx_fmt=png

这是个啥玩意儿

我追溯到一个微软Azure的announcement:https://github.com/Azure/app-service-announcements/issues/84

发现它是针对Azure Function设计的,这是App Service进一步包装以后的服务。与传统部署的差别就是,传统部署会把新文件覆盖到wwwroot目录,也就是我们的网站根目录,而用了RUN_FROM_PACKAGE的话,网站执行的时候会指向一个zip文件,压缩包的内容会映射到wwwroot目录,但会变成只读

使用这个功能有一些好处,比如可预测、更快速的部署、更快速的启动性等等,具体大家可以去看微软公告的介绍。

恢复网站运行

想要临时恢复网站运行,非常简单,只要WEBSITE_RUN_FROM_PACKAGE这个设置整个删除,重启网站,就可以恢复到部署前的良好版本。但是Azure DevOps将来的部署,将不会起作用。因为真实的wwwroot目录不会被更新了。

640?wx_fmt=png

恢复至CD部署前版本:6980

那如何自动部署呢

我们需要修改Azure DevOps部署任务的默认值

编辑你的Release定义,在Tasks下找到Deploy Azure App Service子任务。

640?wx_fmt=png

展开Additional Deployment Options,勾选 Select deployment method,然后手工选择为 Web Deploy,保存设置。

640?wx_fmt=png

然后重新提交一个Release,等待成功部署。完成之后就可以看到正确的新版本被部署在wwwroot物理路径下了,网站也能正常启动:

640?wx_fmt=png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acwing 135 最大子序和

Acwing 135 最大子序和 题目: 输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。 题解: 我们把这个问题的集合分成n份,第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用,也便于客户端更好的调用;通过网关可以灵活地控制服务应用接口负载,故障迁移,安全控制,监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格,所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天,该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示:“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动,这是一款更加现代化、创新且实用的生产力工具”。据悉&…

DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

DotNetty 实现 Modbus TCP 系列 (一) 报文类DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例DotNetty 作为一个半成品,我们不需要关注细节的实现,只需要关注自己的业务即可,所以最主要的就是处理 Codecs 和 Handler。所有…

Acwing -- 单调队列优化的DP问题

文章目录引入acwing154 滑动窗口应用135 最大子序和1088.旅行问题AcWing 1087. 修剪草坪28AcWing 1089. 烽火传递AcWing 1090. 绿色通道AcWing 1091. 理想的正方形引入 acwing154 滑动窗口 题目链接 题解 应用 闫氏最优化问题分析法 135 最大子序和 题目: 输入…

模板:半平面交(计算几何)

所谓半平面交,就是和“半平先生”当面交谈。顾名思义,这是一个源于日本的算法。 (逃) 前言 感觉应用很灵活的一个算法,一切有两个变量的线性规划问题都可以转化为半平面交。 有时可能要注意取等问题(指射…

[小技巧]C#中如何为枚举类型添加描述方法

背景在我们的日常开发中,我们会经常使用枚举类型。有时我们只需要显示枚举的值或者枚举值对应名称, 但是在某些场景下,我们可能需要将枚举值显示为不同的字符串。例: 当前我们有如下枚举Level这个枚举有4个可选值B, N, G, VG。 现…

Loj#3320-「CCO 2020」旅行商问题

正题 题目链接:https://loj.ac/p/3320 题目大意 有一张nnn个点的无向完全图,每一条边是红色或者蓝色,对于每个点sss求从这个点出发的一条尽量短的经过所有点的路径。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 显然地猜测一下最短的长度肯定是n…

AcWing 1087. 修剪草坪28

AcWing 1087. 修剪草坪 题意: 有n个数,不能选超过连续的k个数,问所能选的最大值是多少? 题解: 我们首先分析dp过程: dp[i]表示选择完前i个数的最大值 sum[i]表示前i项和 对于第i个数,它有两个情况&#…

工业通信的开源项目 HslCommunication 介绍

前言:本项目的孵化说来也是机缘巧合的事,本人于13年大学毕业后去了一家大型的国企工作,慢慢的走上了工业软件,上位机软件开发的道路。于14年正式开发基于windows的软件,当时可选的技术栈就是MFC和C#的winform&#xff…

【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)

文章目录Gorgeous SequenceTyvj 1518 CPU监控【清华集训2015】VNaive OperationsPictureWalking RaceGorgeous Sequence HDU5306 操作 区间与xxx取min\rm minmin查询区间最大值查询区间和 比较暴力的线段树维护区间 Max : 区间最大值sub_max : 严格小于最大值的区间次大值…

Acwing 1089. 烽火传递

Acwing 1089. 烽火传递 题意: 有n个数,要保证每m个数中必须选一个,问所选数的最小总和是多少 题解: 我一开始设的状态为:dp[i]表示前i个数选完的最小值,第i个数可以选也可以不选,但是这样一个状态&…

IIS作为ASP.NET Core2.1 反向代理服务器未说的秘密

--以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论---相比ASP.NET,出现了3个新的组件:ASP.NET Core Module、Kestrel、dotnet.exe, 后面我们会理清楚这三个组件的作用和组件之间的交互原理。 ASP.NET Core 设计的初衷是开源…

程序员修神之路--分布式缓存的一条明路(附代码)

菜菜呀,由于公司业务不断扩大,线上分布式缓存服务器扛不住了呀程序员主力 Y总如果加硬件能解决的问题,那就不需要修改程序菜菜我是想加服务器来解决这个问题,但是有个问题呀程序员主力 Y总???菜…

长沙.NET技术社区正式成立

感谢大家的关注,请允许我冒昧的向大家汇报长沙.NET技术社区第一次交流会的会议进展情况。活动过程汇报2019年2月17日,继深圳,广州,西安,成都,苏州相继成立了.net社区之后,酝酿已久的长沙.net社区…

Asp.NetCore轻松学-部署到 IIS 进行托管

前言经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地址、端口(一个或者多…

响应式编程知多少 | Rx.NET 了解下

1. 引言An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.ReactiveX 使用可观察数据流进行异步编程的API。 ReactiveX结合了观察者…

.NET Core中的验证组件FluentValidation的实战分享

今天有人问我能不能出一篇FluentValidation的教程,刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation,所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享&#xf…

笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

文章目录笛卡尔树介绍例题Largest Submatrix of All 1’s应用「POI2015」洗车 Myjnie[AGC028B] Removing BlocksSPOJ PERIODNI笛卡尔树 介绍 笛卡尔树是一种数据结构,每个点由两个值,键值key和权值val,组成 其键值满足二叉树性质 即点的左子…

如何为ASP.NET Core设置客户端IP白名单验证

本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式。你可以使用一下3种方式:使用中间件检查每个请求的远程IP地址使用Action过滤器为指定的Controller或action方法添加针对远程IP地址的检查使用IPageFilter为Razor Pages应用添加针对远程IP地…