部署.NET控制台应用为Azure WebJob时的连接字符串转换错误
我之前部署.NET控制台应用作为Azure WebJob时,也踩过配置转换的坑,给你几个实用的排查和解决方向:
补全TransformXml的完整配置
你只提到添加了<UsingTask>节点,但光有这个还不够,得加上执行转换的Target配置,确保编译时能把环境配置应用到输出文件里。完整的csproj配置片段应该是这样的:<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" /> <Target Name="TransformConfigFiles" AfterTargets="Build"> <TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutputPath)\$(AssemblyName).exe.config" /> </Target>重点注意
Destination路径,必须指向输出目录里的[你的应用名].exe.config——WebJob实际运行时读取的是这个文件,不是项目根目录的原App.config。检查配置转换的语法正确性
打开你的App.Release.config(或对应发布环境的配置文件),先确认根节点有没有声明xdt命名空间:<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">然后看连接字符串的转换节点,语法要准确,比如:
<connectionStrings> <add name="YourDbConn" connectionString="Azure数据库的连接字符串" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </connectionStrings>如果
xdt命名空间漏了,或者转换属性写错了,转换逻辑根本不会触发。确认发布时的配置环境
发布WebJob的时候,一定要选对对应的配置(比如Release),要是不小心选了Debug,那会用App.Debug.config的配置,自然达不到你想要的生产环境转换效果。发布向导里的配置选项别忽略了。本地先验证转换结果
先在本地执行发布,然后去输出目录(比如bin\Release\net48这类路径)找到生成的[你的应用名].exe.config,打开看看连接字符串是不是已经换成Azure的了。本地都没转换成功的话,上传到Azure肯定也不行,先把本地的问题解决掉。Azure上传时的小细节
如果是手动上传zip包到Azure Portal,要确保zip包里是发布后的输出文件(包括转换好的exe.config),不是项目源码。另外,也可以试试用Visual Studio自带的WebJob发布工具,或者Azure CLI的az webapp deployment source config-zip命令,这些工具会自动处理配置转换的流程,比手动上传更不容易出错。
内容的提问来源于stack exchange,提问作者Katie

