如何阻止csproj文件中URL值在dotnet build时被自动解码?
解决MSBuild Exec任务自动解码URL的问题
要阻止MSBuild在传递命令行参数时自动解码URL,确保遗留工具WebApiTool能获取到原始编码的URL值,可以采用以下几种方法:
方法一:对URL进行双重编码
由于MSBuild会自动解码一次URL,因此对目标编码URL再进行一次URL编码,这样MSBuild解码后就会得到你需要的原始编码值。
修改后的csproj配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> <Target Name="Generate code"> <Exec Command="dotnet tool run WebApiTool QueryUrl=https%253A%252F%252Fmy-web-api.azurewebsites.net%252Fapi%252Fv2%252Fexport%253Ftype%253Djson%2526excludes%253DexcludeThis%252CexcludeThat" /> </Target> </Project>
这里将原编码URL中的%替换为%25(即对%进行URL编码),实现双重编码效果。
方法二:使用MSBuild属性转义特殊字符
通过定义MSBuild属性存储原始编码URL,再在Exec命令中对%进行转义,避免MSBuild自动解码。
修改后的csproj配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <!-- 存储原始编码的URL --> <EncodedQueryUrl>https%3A%2F%2Fmy-web-api.azurewebsites.net%2Fapi%2Fv2%2Fexport%3Ftype%3Djson%26excludes%3DexcludeThis%2CexcludeThat</EncodedQueryUrl> </PropertyGroup> <Target Name="Generate code"> <!-- 将属性中的%替换为%25,实现转义 --> <Exec Command="dotnet tool run WebApiTool QueryUrl=$(EncodedQueryUrl.Replace('%', '%25'))" /> </Target> </Project>
这种方式更易于维护,原始编码URL清晰可见,通过Replace方法自动完成转义。
方法三:使用XML实体转义
在XML中,也可以通过将%转义为%,让MSBuild在解析XML时保留%的原始状态,避免解码。
修改后的csproj配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> <Target Name="Generate code"> <Exec Command="dotnet tool run WebApiTool QueryUrl=https%3A%2F%2Fmy-web-api.azurewebsites.net%2Fapi%2Fv2%2Fexport%3Ftype%3Djson%26excludes%3DexcludeThis%2CexcludeThat" /> </Target> </Project>
这种方法直接在XML层面转义特殊字符,确保%不会被MSBuild解析为URL编码的一部分。
内容的提问来源于stack exchange,提问作者Gio2k
相关产品推荐
相关产品推荐

