如何在.Net Core 2中为IIS发布定义自定义web.config?

时间:2018-05-07 22:07:56

标签: iis visual-studio-2017 asp.net-core-2.0

VS将生成(并覆盖)web.config文件,作为发布到IIS的一部分。我需要在文件中包含各种项目(例如扩展文件上传最大大小限制,重定向到HTTPS等)。我目前不得不在每次发布后将内容复制并粘贴到文件中。

有没有办法定义Visual Studio在为IIS发布.NET Core 2 Web应用程序时生成的web.config文件的内容?

2 个答案:

答案 0 :(得分:7)

不确定您是否解决了这个问题,但是如果其他任何人遇到此问题,我都会遇到这个问题,最后去寻找转换任务的源代码。它包含一些日志记录,因此我运行了dotnet publish和一个/v:n参数,该参数将日志记录的详细程度设置为“正常”:

dotnet publish src\MyProject -o ..\..\publish /v:n

当我运行它时,我在输出中看到了它:

_TransformWebConfig:
  No web.config found. Creating 'C:\Development\MyProject\publish\web.config'

即使项目中有一个web.config。我将web.config的属性“复制到输出目录” 更改为“始终” ,现在我项目中的web.config与自动生成的内容。

我的csproj现在有了它:

    <None Include="web.config">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

并且发布输出具有:

_TransformWebConfig:
  Updating web.config at 'C:\Development\MyProject\publish\web.config'

注意::如果要发布到已包含web.config的现有目录,它将更新该文件。 (即旧出版物)。如果您未指定输出目录,它将输出到类似/bin/Debug/net471/publish/的目录中,其中可能包含旧文件。

注意2::您仍然需要csproj文件中“项目”节点上的Sdk="Microsoft.NET.Sdk.Web"属性,否则它甚至都不会寻找Web.configs。

供参考,这是任务源代码: https://github.com/aspnet/websdk/blob/master/src/Publish/Microsoft.NET.Sdk.Publish.Tasks/Tasks/TransformWebConfig.cs

答案 1 :(得分:3)

我终于回到这个话题,并使用了一个转换:

  1. 在项目的根目录中创建一个web.release.config文件

  2. 将该文件的属性设置为Build Action = None,这样就不会将其直接复制到目标文件夹中

  3. 使用转换语法来定义需要插入的部分:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
      <location>
        <system.webServer>
          <security xdt:Transform="Insert">
            <requestFiltering>
              <requestLimits maxAllowedContentLength="209715200" />
            </requestFiltering>
          </security>
          <rewrite xdt:Transform="Insert">
            <rules>
              <rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAny">
                  <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
              </rule>
            </rules>
          </rewrite>
          <modules xdt:Transform="Insert" runAllManagedModulesForAllRequests="false">
            <remove name="WebDAVModule" />
          </modules>
        </system.webServer>
      </location>
    </configuration>