<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Edi Wang</title><subtitle>Microsoft MVP for Azure</subtitle><rights>© 2009 - 2026 edi.wang</rights><updated>2026-04-04T23:15:55Z</updated><generator uri="https://edi.wang">Moonglade v15.13.0-preview.1</generator><entry><id>2BD9D033-62CF-4B4C-8AE2-59D73FC1FA19</id><title>Update Files in Azure File Share on Schedule with Azure Container App Jobs</title><updated>2026-02-23T10:54:25Z</updated><published>2026-02-23T10:54:25Z</published><link href="https://edi.wang/post/2026/2/23/update-files-in-azure-file-share-on-schedule-with-azure-container-app-jobs" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>I have a containerized app that relies on a data file mounted at runtime, an IP lookup API that reads qqwry.dat file. I deploy the App on Azure Container Apps, and use Azure File Share to mount the data directory for the app to use. One problem remains: How to keep the file updated automatically? e.g., to check for updates daily without manual replacing the file on Azure Storage Account. In this post, I will introduce how to use Azure Container Apps Jobs to run a small "updater container" on a schedule. The updater downloads the latest file and writes it into the mounted file share, while the main API container reads the file from the same mount path.</content></entry><entry><id>FD664CCB-339F-4DB8-8A67-656F6D591AAB</id><title>Modernizing My Azure Deployment Script with PowerShell and Bicep</title><updated>2026-02-08T07:34:39Z</updated><published>2026-02-08T07:34:39Z</published><link href="https://edi.wang/post/2026/2/8/modernizing-my-azure-deployment-script-with-powershell-and-bicep" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>I refactored Moonglade's Azure deployment from a single, all‑in‑one PowerShell script to a PowerShell + Bicep setup. PowerShell now handles orchestration and user input, while Bicep declaratively defines the App Service Plan, Web App, SQL Server, database, firewall rule, and storage account. This keeps the same one-click experience, but makes the infrastructure easier to maintain, review, and reuse.</content></entry><entry><id>FE8579AC-7BB8-4B4C-8D4E-04E0D557FFD9</id><title>PowerShell Script to Check Azure App Service SSL Certificate Expiration</title><updated>2025-08-18T04:48:11Z</updated><published>2025-08-18T04:48:11Z</published><link href="https://edi.wang/post/2025/8/18/powershell-script-to-check-azure-app-service-ssl-certificate-expiration" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>When you have a lot of App Service instances running in your Azure subscription, managing their SSL certificate status could be a problem. Azure portal itself does have certain monitoring and advising feature to visualize the certificate status and warn you before a certificate expires. However, in some cases, we prefer this to be done in command line environment. That's why I put together this handy PowerShell script that uses Azure CLI to keep tabs on all your App Service SSL certificates.</content></entry><entry><id>B6CCE0D3-EF73-4428-85E3-FE89F607B311</id><title>Automating Deployment of Open WebUI on Azure Container Apps with Bicep</title><updated>2025-07-24T05:20:05Z</updated><published>2025-07-24T05:20:05Z</published><link href="https://edi.wang/post/2025/7/24/automating-deployment-of-open-webui-on-azure-container-apps-with-bicep" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="AI" /><category term="DevOps" /><category term="Microsoft Azure" /><content>In my previous blog post, I introduced how to deploy Open WebUI with Azure OpenAI on Azure Container Apps in Azure Portal manually. However, manual deployment usually makes people work 996. In this post, I will show you how to automate everything using Bicep. If you’re new to Bicep, think of it as a friendlier way to define Azure resources as code compared to raw ARM templates. I’ll walk you through my Bicep file, explaining how each block helps set up a scalable, persistent, and easy-to-manage Open Web UI deployment.</content></entry><entry><id>6EC95F94-EFAC-4F44-B28C-7D6B46F93B36</id><title>Auto Generating Incremental Resource Names in Azure Bicep</title><updated>2025-05-19T04:41:45Z</updated><published>2025-05-19T04:41:45Z</published><link href="https://edi.wang/post/2025/5/19/auto-generating-incremental-resource-names-in-azure-bicep" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>Bicep's syntax is already pretty clean, but sometimes you run into situations like needing to concatenate strings or format names repeatedly, doing small calculations based on input parameters, or having long, messy expressions inside resource definitions. Let’s say you want to automatically generate a series of VM names like web-01, web-02, and so on. Without functions, you’d have to write 'web-${padLeft(string(i+1), 2, '0')}' every time, makes you work 996. Let’s see how to make this easier.</content></entry><entry><id>0C38DF90-40EF-40CB-9CA0-7ABC97C2CC40</id><title>Deploying Azure App Service and SQL Server with Bicep</title><updated>2025-05-18T01:18:46Z</updated><published>2025-05-18T01:18:46Z</published><link href="https://edi.wang/post/2025/5/18/deploying-azure-app-service-and-sql-server-with-bicep" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>Last week at Microsoft Reactor Shanghai, I addressed a speech "Automating Infrastructure as Code (IaC) Deployment with Azure Bicep". One of the demo was how to use Bicep to deploy a complete Azure web app environment, including an App Service and an Azure SQL Database. I know we didn’t have time to walk through the whole script, so I wanted to break it down here in a blog post. Let’s walk through this Bicep file together, and see what each part does!</content></entry><entry><id>0B86092D-313B-4AC6-A64E-635FE38196E4</id><title>Solving "npm install" ECONNRESET Error on Azure DevOps</title><updated>2023-08-16T13:34:49Z</updated><published>2023-08-16T13:34:49Z</published><link href="https://edi.wang/post/2023/8/16/npm-econnreset-azure-devops" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Web Development" /><content>A few months ago, my Angular project on Azure DevOps started to have build failure very often. Error message is "npm ERR! network read ECONNRESET", which indicates npm can't connect to internet. This problem does not happen every time, usually re-run failed jobs several times can produce a good build. But still, this is very annoying. So, I took some time to investigate and solve it. …</content></entry><entry><id>BA564764-B34D-4DFC-8860-C35B79B4F0B5</id><title>How I Built This Blog with Azure Services</title><updated>2019-07-19T10:00:22Z</updated><published>2019-07-19T10:00:22Z</published><link href="https://edi.wang/post/2019/7/19/how-i-built-this-blog-with-azure-services" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>My website (https://edi.wang) is an open-source blog system written in .NET Core and runs on Microsoft Azure. This article explains why and how the blog benefits from Azure's services. History of this blog The history of my blog dates to 2003, and the .NET version of the blog was originally built 10 years ago by the ASP.NET 2.0 WebForm VB and Access database and has been gradually maintained and …</content></entry><entry><id>0A866CE8-31DC-40C0-81EC-30508059DF4F</id><title>How to Pack a .NET Core Class Library and Upload to NuGet</title><updated>2019-04-24T05:46:32Z</updated><published>2019-04-24T05:46:32Z</published><link href="https://edi.wang/post/2019/4/24/how-to-pack-a-net-core-class-library-and-upload-to-nuget" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term=".NET" /><content>NuGet is the package manager of the. NET world, we can both use official website nuget.org, or build our own corporate and private servers. Now, with . NET Core, it's easier than ever to pack and upload a NuGet package, let's take a look! NuGet Account If you want your package to be used by every .NET developers in the world, then you need to have a nuget.org account to upload your own package.  …</content></entry><entry><id>0F61EAEA-02D0-48A1-B3D1-FB5927BC17B1</id><title>Incremental Build Number for .NET Core via Azure DevOps</title><updated>2019-03-01T08:16:09Z</updated><published>2019-03-01T08:16:09Z</published><link href="https://edi.wang/post/2019/3/1/incremental-build-number-for-net-core-via-azure-devops" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term=".NET" /><content>People familiar with the. NET framework knows that we can let the compiler self-increase the version number by specifying AssemblyVersion as 10.0.*. But. NET core and. NET Standard are not. Even with open-source projects like MSBump, there are certain flaws. Typically, such a requirement happens on a CI/CD server. Let's take a look at how to easily handle it with Azure DevOps. About Versioning in …</content></entry><entry><id>60783464-1D05-4754-B11E-E7BF8E008B26</id><title>Send Email After Release Deployment in Azure DevOps</title><updated>2019-02-21T07:55:23Z</updated><published>2019-02-21T07:55:23Z</published><link href="https://edi.wang/post/2019/2/21/send-email-after-release-deployment-in-azure-devops" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><content>By default, Azure DevOps sends an email notification to team members after the compilation succeeds or fails. But in a CI/CD environment, we are more concerned about when the deployment is complete and then conducting manual or automated testing. Let's take a look at how to get Azure DevOps to automatically send mail notifications to team members after a successful deployment. Enter Project …</content></entry><entry><id>EA9333B0-6AD2-42AA-ACC5-B70B8A829238</id><title>Fix .NET Core Website Failure After Deployment from Azure DevOps</title><updated>2019-02-15T13:05:47Z</updated><published>2019-02-15T13:05:47Z</published><link href="https://edi.wang/post/2019/2/15/fix-net-core-website-failure-after-deployment-from-azure-devops" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term=".NET" /><category term="Microsoft Azure" /><content>I met a strange problem recently. After configuring the CI/CD pipeline with Azure DevOps and automatically deploy to Azure App Services, the. NET Core Website failed to start. Let's see how we can solve this problem.  Find the issue First of all, fortunately, this is a staging environment. I found that the site unexpectedly did not log anything, even log directory cannot be found, which is very …</content></entry><entry><id>37B490CE-8CF1-40FA-A3AC-22E79F706F43</id><title>Fix Azure DevOps TF14045 Error When Deploy to Azure</title><updated>2019-02-13T05:14:53Z</updated><published>2019-02-13T05:14:53Z</published><link href="https://edi.wang/post/2019/2/13/fix-azure-devops-tf14045-error-when-deploy-to-azure" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>I encountered an error when I tried to setup CI/CD in Azure DevOps, I tried to deploy a .NET Core application to Azure App Service, but Azure DevOps won't connect to Azure. This is a known issue for Microsoft. Let's see how we can manually set up a connection between Azure DevOps and Azure to work around this issue. First, the error message I met was: Failed to get resource ID for resource type ' …</content></entry><entry><id>07E7DCE9-BCB8-43B6-9A93-7DAE60099F88</id><title>Build .NET Core 2.2 Projects on Azure DevOps</title><updated>2018-12-13T08:17:41Z</updated><published>2018-12-13T08:17:41Z</published><link href="https://edi.wang/post/2018/12/13/build-dotnet-core-22-projects-on-azure-devops" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><content>.NET Core 2.2 has been release for couple of weeks. However, the build pipeline is still failing these days. Microsoft has not installed .NET Core 2.2 SDK to the hosted VS2017 agents yet. Let's see how to work around this issue and have a success build for our .NET Core 2.2 apps.  1. Add Task Edit your build definition, and click the "+" button to add a new task.  2. Add .NET Core SDK Installer …</content></entry><entry><id>A25F50C1-0DE1-40FA-B323-BD6F1C918778</id><title>Configure VSTS Build for UWP Apps</title><updated>2017-10-06T02:41:23Z</updated><published>2017-10-06T02:41:23Z</published><link href="https://edi.wang/post/2017/10/6/configure-vsts-build-for-uwp-apps" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="Windows Development" /><category term="DevOps" /><content>UWP Apps usually require a lot of time to compile a "release" package for submitting to Windows Store, and if you are working in a team, TFS/VSTS can help your team ensure that each check-in has a success build, and make it easier for deployment and testing. Let's see a basic example of how to setup a CI build for a UWP App on VSTS.  Important Pre-condition: Before you do that, please ensure that …</content></entry><entry><id>63F0A51B-0298-4DAF-8427-0F42AA56048E</id><title>Windows 10 UWP: How to Debug OnFileActivated Launch Failure</title><updated>2017-08-25T02:21:41Z</updated><published>2017-08-25T02:21:41Z</published><link href="https://edi.wang/post/2017/8/25/uwp-debug-onfileactivated-launch-issue" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="Windows Development" /><category term="DevOps" /><content>Today I am working on my Image Portray App, and I get my code blown up. The problem is, when the App is already started, it can open .ink file with double click from a file. But when the App is not launched, opening a .ink file to start the App will make it crash. As other UWP that supports file type association, I also use OnFileActivated event to launch my App. This kind of problem could not be …</content></entry><entry><id>60F7A3C4-CF88-4B5E-9FBC-51069F733CFD</id><title>Remote Deploy and Debug UWP Apps</title><updated>2017-07-15T02:30:53Z</updated><published>2017-07-15T02:30:53Z</published><link href="https://edi.wang/post/2017/7/15/uwp-remote-debug" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="Windows Development" /><category term="DevOps" /><content>These days I am developing an App that need to be tested on multiple languages environment. I can set my local dev box to different language, and restart or sign out / sign in to Windows again to test different languages. But this is very inconvenient. I want to setup a Windows 10 virtual machine with Chinese language and let Visual Studio 2017 deploy and debug the App right into the VM. Back the …</content></entry><entry><id>2D060449-B902-4B98-A57A-F8525A077FA8</id><title>Configure Continuous Delivery for ASP.NET Core Website on Azure</title><updated>2017-04-06T08:17:37Z</updated><published>2017-04-06T08:17:37Z</published><link href="https://edi.wang/post/2017/4/6/configure-continuous-delivery-for-aspnet-core-website-on-azure" hreflang="en-us" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><category term="Microsoft Azure" /><content>Today I am trying new DevOps tools in VS2017 and Azure, my goal is to automate the process from development to production for an exsiting ASP.NET Core project. I have encountered some issues, and with the help of Microsoft Support, I was able to solve them and share with you guys. First, there are two ways to configure CD for Azure Web Apps. I prefer create a website first, then configure it from …</content></entry><entry><id>0175EC26-2FB4-4E0C-9850-86AE3BB6FE61</id><title>Fix Visual Studio 2015 Razor Editor Blow Up</title><updated>2015-08-09T14:07:08Z</updated><published>2015-08-09T14:07:08Z</published><link href="https://edi.wang/post/2015/8/9/razor-editor-blow-up-vs2015" hreflang="zh-hans" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><content>Visual Studio 2015 has been RTM for one month. However, it blows up very often, such as Razor editor. When I try to open any .cshtml file, it blows up with this error, then the syntax highlight is gone. I tried to uninstall all add-on, even repair install VS2015 can't get it working.  The detailed error message is: System.Reflection.TargetInvocationException: Exception has been thrown by the …</content></entry><entry><id>3D806416-F4F3-41C2-A7D7-907727749C15</id><title>VS2013 Plug-in Development: How Do I Obtain the Path of a Selected File in Solution Explorer</title><updated>2014-10-13T05:18:23Z</updated><published>2014-10-13T05:18:23Z</published><link href="https://edi.wang/post/2014/10/13/vs2013-vsix-how-to-get-selected-item-path-in-solution-explorer" hreflang="zh-hans" /><author><name>Edi Wang</name><email>Edi.Wang@outlook.com</email></author><category term="DevOps" /><content>最近在爆个插件，有个需求就是能够在Solution Explorer中右键点击某个文件然后做一些下流的操作，那么首先就要想办法得到用户选择的文件或者文件们。肿么搞呢。研究了一下WebEssential的代码，总结了一下： 首先，你需要获得DTE2对象，貌似指的是你当前的VS实例。为了方便使用定义成一个静态属性，放到package类里面： 也就是继承Package类的那个类，比如public sealed class ForeverAlonePackage : Package private static DTE2 _dte;  internal static DTE2 DTE {     get     {         if (_dte == null)             _dte = ServiceProvider.GlobalProvider.GetService(</content></entry></feed>