我正在发布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?