Gỡ lỗi / phát hành Web.Config


82

Tôi biết rằng web.config trong Visual Studio 2010 cung cấp khả năng chuyển từ cơ sở dữ liệu từ chế độ Gỡ lỗi sang chế độ Phát hành.

Đây là Web.Release.config của tôi:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

Đây là mã Web.Debug.config của tôi:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Live1" connectionString="Data Source=Live;Initial Catalog=LiveDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

Và đây là mã Web.config của tôi:

<?xml version="1.0"?>

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 -->
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
       <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
       <providers>
          <clear/>
          <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
       </providers>
    </membership>

    <profile>
       <providers>
          <clear/>
          <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
       </providers>
    </profile>

    <roleManager enabled="false">
       <providers>
          <clear/>
          <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
       </providers>
    </roleManager>

  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Khi tôi xuất bản dự án của mình, không có gì hiển thị trong tệp Web.config của tôi. Nó Không hiển thị chuỗi kết nối Cơ sở dữ liệu trực tiếp của tôi?

Câu trả lời:


131

Các biến đổi web.config là một phần của Visual Studio 2010 sử dụng XSLT để "chuyển đổi" tệp web.config hiện tại thành phiên bản .Debug hoặc .Release của nó.

Trong các tệp .Debug / .Release của bạn, bạn cần thêm tham số sau vào các trường chuỗi kết nối của mình:

xdt:Transform="SetAttributes" xdt:Locator="Match(name)"

Điều này sẽ làm cho mỗi dòng chuỗi kết nối tìm tên phù hợp và cập nhật các thuộc tính cho phù hợp.

Lưu ý: Bạn sẽ không phải lo lắng về việc cập nhật thông số providerName của mình trong các tệp chuyển đổi, vì chúng không thay đổi.

Đây là một ví dụ từ một trong những ứng dụng của tôi. Đây là phần tệp web.config:

<connectionStrings>
      <add name="EAF" connectionString="[Test Connection String]" />
</connectionString>

Và đây là phần web.config.release thực hiện chuyển đổi thích hợp:

<connectionStrings>
      <add name="EAF" connectionString="[Prod Connection String]"
           xdt:Transform="SetAttributes"
           xdt:Locator="Match(name)" />
</connectionStrings>

Thêm một lưu ý: Chuyển đổi chỉ xảy ra khi bạn xuất bản trang web, không phải khi bạn chỉ chạy nó bằng F5 hoặc CTRL + F5. Nếu bạn cần chạy bản cập nhật đối với một cấu hình đã cho cục bộ, bạn sẽ phải thay đổi thủ công tệp Web.config của mình cho việc này.

Để biết thêm chi tiết, bạn có thể xem tài liệu MSDN

https://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx


20
Bạn có thể thêm một lưu ý rằng điều này xảy ra trong thời gian xuất bản KHÔNG PHẢI F5 thời gian cho câu trả lời? Rõ ràng tôi đã có điều này chính xác trong 2 giờ nhưng không nhận ra điều đó.
Paul

Làm cách nào để làm cho điều này hoạt động với Visual Studio Online Continuous Build? Tôi muốn nó biến đổi Web.Config của tôi trong quá trình xây dựng và triển khai sang Azure.
Rosdi Kasim

1
@RosdiKasim - Tôi không chắc điều này có khớp 100% với Visual Studio trực tuyến hay không, nhưng khi tôi cần triển khai một dự án cụ thể (nếu tôi có nhiều) hoặc sử dụng một bản dựng khác (và do đó chuyển đổi), tôi chỉ định mọi thứ trực tiếp trong phiên bản trang web Azure. Đây là một số chi tiết tôi đã viết về điều đó một thời gian trước: freshconsults.com/…
Dillie-O

đây là một liên kết đến MSDN rằng descirbe này chi tiết msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık

1
Ghi chú thêm của bạn về việc chạy trang web trong VS qua F5 so với xuất bản rất hữu ích đối với tôi.
Denis M. Kitchen

8

Có thể sử dụng ConfigTransformmục tiêu xây dựng có sẵn dưới dạng gói Nuget - https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Tất cả các tệp biến đổi "web. * .Config" sẽ được chuyển đổi và xuất ra dưới dạng một loạt tệp "web. *. Config.transformed" trong thư mục đầu ra bản dựng bất kể cấu hình bản dựng đã chọn.

Điều tương tự cũng áp dụng cho các tệp chuyển đổi "app. *. Config" trong các dự án không phải web.

và sau đó thêm mục tiêu sau vào của bạn *.csproj.

<Target Name="TransformActiveConfiguration" Condition="Exists('$(ProjectDir)/Web.$(Configuration).config')" BeforeTargets="Compile" >
    <TransformXml Source="$(ProjectDir)/Web.Config" Transform="$(ProjectDir)/Web.$(Configuration).config" Destination="$(TargetDir)/Web.config" />
</Target>

Đăng câu trả lời vì đây là bài đăng Stackoverflow đầu tiên xuất hiện trên Google về chủ đề này.


Phương pháp tuyệt vời này đã làm việc phi thường đối với tôi, tuy nhiên tôi không phải cài đặt ConfigTransform mà bạn đề cập (luôn biến đổi tất cả các cấu hình) - Tôi chỉ đặt cấu hình xây dựng đang hoạt động trên Visual Studio (ví dụ: tôi thay đổi nó thành gỡ lỗi), xây dựng giải pháp và thì đấy!
BornToCode

5

Để biến đổi hoạt động trong quá trình phát triển (sử dụng F5 hoặc CTRL + F5), tôi thả ctt.exe ( https://ctt.codeplex.com/ ) vào thư mục gói (package \ ConfigTransform \ ctt.exe).

Sau đó, tôi đăng ký một sự kiện trước hoặc sau khi xây dựng trong Visual Studio ...

$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config"
$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)web.config" transform:"$(ProjectDir)web.$(ConfigurationName).config" destination:"$(ProjectDir)web.config"

Đối với các phép biến đổi, tôi sử dụng tiện ích mở rộng SlowCheeta VS ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).


1
Để duy trì khoảng trắng (ngăn cấu hình đã chuyển đổi nằm trên một dòng), hãy thêm giữ nguyên khoảng trắng indent IndentChars: "" vào dòng lệnh. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
Emanuel Nilsson

3

Nếu bạn định thay thế tất cả các chuỗi kết nối bằng các chuỗi tin tức cho môi trường sản xuất, bạn chỉ cần thay thế tất cả các chuỗi kết nối bằng các chuỗi sản xuất bằng cú pháp sau:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<connectionStrings xdt:Transform="Replace">
    <!-- production environment config --->
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>
....

Thông tin cho câu trả lời này được mang lại từ câu trả lời nàybài đăng trên blog này .

thông báo : Như những người khác đã giải thích, cài đặt này sẽ chỉ áp dụng khi ứng dụng xuất bản chứ không phải khi chạy / gỡ lỗi nó (bằng cách nhấn F5).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.