安装NuGet软件包后,通过XML文档转换将XDT属性添加到R​​elease.config中

时间:2018-10-04 11:22:27

标签: xml nuget web.config-transform xdt-transform

我正在发布NuGet软件包以供内部使用。此程序包通过安装在程序包中引用的程序集中的ErrorController处理ASP.NET MVC Web应用程序中的错误。

因此,在安装此软件包时,我希望以下内容最终出现在该软件包将用于项目中的Web. Release .config中被安装:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer xdt:Transform="InsertIfMissing">
    <httpErrors errorMode="Custom" existingResponse="Replace" xdt:Transform="InsertIfMissing" >
      <remove statusCode="404" xdt:Transform="InsertIfMissing" xdt:Locator="Match(statusCode)" />
      <error statusCode="404" path="/error/404" responseMode="ExecuteURL" xdt:Transform="InsertIfMissing" xdt:Locator="Match(statusCode)" />

      <remove statusCode="500" xdt:Transform="InsertIfMissing" xdt:Locator="Match(statusCode)" />
      <error statusCode="500" path="/error/500" responseMode="ExecuteURL" xdt:Transform="InsertIfMissing" xdt:Locator="Match(statusCode)" />
    </httpErrors>
  </system.webServer>
</configuration>

也就是说,包括 xdt个属性。我只希望在构建时将其转换的发布配置中使用此元素,而不是常规Web.config中的元素,因此在开发应用程序时会遇到常规404和500错误,有助于开发和调试。 (无法通过在Web.config 中将errorMode设置为“ Detailed”或“ DetailedLocalOnly”来包含此元素,例如,会从打印到Razor视图的语法错误中获取该元素。屏幕)。

因此,我在NuGet软件包的名为content\Web.Release.config.install.xdt的文件中包含上述内容,以转换配置文件(我们使用Packages.config,而不是<PackageReference />),并且在安装软件包时, system.webServer元素被插入到文件中,但是没有 xdt属性(当然,因为它们是在安装时应用的,这本身就是一种转换) :

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404"/>
    <error statusCode="404" path="/error/404" responseMode="ExecuteURL"/>
    <remove statusCode="500"/>
    <error statusCode="500" path="/error/500" responseMode="ExecuteURL"/>
  </httpErrors>
</system.webServer>

发布此应用程序时,由于缺少xdt属性,因此从转换后的配置中忽略了此元素。

例如,您不能使用<system.webServer xdt:Transform="InsertIfMissing SetAttributes(xdt:Transform)">(预期会丢失<system.webServer>元素),因为这是Transform属性的无效值。

您也不能使用名称空间别名(xmlns:xdt2="http://schemas.microsoft.com/XML-Document-Transform")并将其应用到现有的xdt属性之外,因为这将导致来自同一名称空间的重复属性。

那么我们可以做什么 将顶部显示的XML插入Web.Release.config?

0 个答案:

没有答案