Menggunakan Web.config yang berbeda dalam lingkungan pengembangan dan produksi

194

Saya perlu menggunakan string koneksi database yang berbeda dan alamat server SMTP di aplikasi ASP.NET saya tergantung pada dijalankan dalam pengembangan atau lingkungan produksi.

Aplikasi membaca pengaturan dari file Web.config melalui properti WebConfigurationManager.AppSettings .

Saya menggunakan perintah Bangun / Terbitkan untuk menyebarkan aplikasi ke server produksi melalui FTP dan kemudian secara manual mengganti Web.config jauh dengan yang benar.

Apakah mungkin entah bagaimana menyederhanakan proses penyebaran? Terima kasih!

Alexander Prokofyev
sumber

Jawaban:

159

Di Visual Studio 2010 dan di atas, Anda sekarang memiliki kemampuan untuk menerapkan transformasi ke web.config Anda tergantung pada konfigurasi build.

Saat membuat web.config, Anda dapat memperluas file di explorer solusi, dan Anda akan melihat dua file:

  • Web.Debug.Config
  • Web.Release.Config

Mereka berisi kode transformasi yang dapat digunakan untuk

  • Ubah string koneksi
  • Hapus jejak dan pengaturan debugging
  • Daftarkan halaman kesalahan

Lihat Web.config Transformation Syntax untuk Penerapan Proyek Aplikasi Web di MSDN untuk informasi lebih lanjut.

Dimungkinkan juga, meskipun secara resmi tidak didukung, untuk menerapkan jenis transformasi yang sama ke app.configfile aplikasi non web . Lihat blog Phil Bolduc mengenai cara memodifikasi file proyek Anda untuk menambahkan tugas baru ke msbuild.

Ini adalah permintaan lama pada Visual Studio Uservoice .

Sebuah ekstensi untuk Visual Studio 2010 dan atas, " SlowCheetah ," tersedia untuk mengurus menciptakan transformasi untuk setiap file konfigurasi. Dimulai dengan Visual Studio 2017.3, SlowCheetah telah diintegrasikan ke dalam IDE dan basis kode dikelola oleh Microsoft. Versi baru ini juga mendukung transformasi JSON.

Pierre-Alain Vigeant
sumber
7
Perhatikan bahwa ini tidak berfungsi untuk proyek situs web lama . Hanya untuk aplikasi web . Saya belum mencoba untuk melihat apakah solusi Phil Bolduc bekerja untuk situs web, tetapi saya curiga tidak, karena mereka tidak memiliki file proyek.
mo.
13
Perhatikan juga bahwa transformasi web.confg hanya berfungsi untuk PENERBITAN, mereka tidak berfungsi jika Anda hanya membangun / menjalankan F5: ((((
Alex
7
Jika web.config Anda tidak mengandung a Web.Debug.Configdan Web.Release.Config, Anda mungkin perlu klik kanan Web.Configdan klik Add Config Transforms.
Doug S
1
@Alex: bagaimana kita bisa menggunakannya untuk build sederhana / F5?
penumpang
1
tautan langsung ke SlowCheetah: marketplace.visualstudio.com/...
Xiao
83

The <appSettings>tag di web.config mendukung atribut file yang akan memuat konfigurasi eksternal dengan itu set sendiri kunci / nilai. Ini akan mengesampingkan pengaturan apa pun yang Anda miliki di web.config Anda atau menambahkannya.

Kami mengambil keuntungan dari ini dengan memodifikasi web.config kami pada waktu instal dengan atribut file yang sesuai dengan lingkungan situs sedang diinstal. Kami melakukan ini dengan menghidupkan installer kami.

misalnya;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

catatan:

  • Perubahan pada .config yang ditentukan oleh atribut tidak akan memicu restart proses pekerja asp.net
Jason Slocomb
sumber
2
Ini adalah jawaban yang sangat baik, terutama ketika Anda memiliki sejumlah besar lingkungan dan beberapa pengaturan untuk beberapa lingkungan memiliki kata sandi dan serupa yang Anda tidak ingin dilacak dalam kontrol sumber.
Phil
1
Apakah ada cara dinamis untuk mengubah jalur file? Berdasarkan server mana Anda berada? Hanya catatan tambahan bahwa ini berfungsi pada proyek situs web lama, bukan aplikasi web. Jadi terima kasih
Perspektif
2
Ada atribut restartOnExternalChangesyang akan memperlakukan file-file itu seolah-olah mereka adalah web.configs. Sumber: learnable.com/books/…
David Schwartz
13

Saya juga ingin tahu. Ini membantu mengisolasi masalah bagi saya

<connectionStrings configSource = "connectionStrings.config" />

Saya kemudian menyimpan connectionStrings.config serta "{host} connectionStrings.config". Ini masih merupakan masalah, tetapi jika Anda melakukan ini untuk bagian yang berbeda di dua lingkungan, Anda dapat menggunakan dan versi web.config yang sama.

(Dan saya tidak menggunakan VS, btw.)

harpo
sumber
Jika Anda akan menggunakan VS, Anda bisa menggunakan prebuild-events untuk menyalin dari debug.connectionstrings.config atau release.connectionstrings.config seperti: salin $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config seperti yang disarankan oleh Scott. Hanselmann: hanselman.com/blog/…
Thomas
6

Saya menggunakan NAnt Build Script untuk digunakan ke lingkungan saya yang berbeda. Saya memilikinya memodifikasi file konfigurasi saya melalui XPath tergantung pada di mana mereka sedang digunakan, dan kemudian secara otomatis menempatkan mereka ke dalam lingkungan itu menggunakan Beyond Compare .

Butuh satu atau dua menit untuk pengaturan, tetapi Anda hanya perlu melakukannya sekali. Kemudian file batch mengambil alih, sementara saya mengambil secangkir kopi lagi. :)

Inilah artikel yang saya temukan di sana.

Jeff Sheldon
sumber
5

Pada satu proyek di mana kami memiliki 4 lingkungan (pengembangan, pengujian, pementasan, dan produksi) kami mengembangkan sistem di mana aplikasi memilih konfigurasi yang sesuai berdasarkan nama mesin yang digunakan.

Ini berhasil bagi kami karena:

  • administrator dapat menggunakan aplikasi tanpa melibatkan pengembang (persyaratan) dan tanpa harus mengutak-atik file konfigurasi (yang mereka benci);
  • nama-nama mesin dipatuhi konvensi. Kami mencocokkan nama menggunakan ekspresi reguler dan digunakan untuk beberapa mesin di lingkungan; dan
  • kami menggunakan keamanan terintegrasi untuk string koneksi. Ini berarti kami dapat menyimpan nama akun dalam file konfigurasi kami pada waktu desain tanpa mengungkapkan kata sandi apa pun.

Ini bekerja dengan baik untuk kami dalam hal ini, tetapi mungkin tidak akan berhasil di mana-mana.

dariom
sumber
3

Editor konfigurasi Perpustakaan Perusahaan dapat membantu Anda melakukan ini. Ini memungkinkan Anda untuk membuat file konfigurasi dasar dan kemudian delta untuk setiap lingkungan. Anda kemudian dapat menggabungkan konfigurasi dasar dan delta untuk membuat web.config khusus lingkungan. Lihatlah informasi di sini yang membawa Anda melaluinya lebih baik daripada yang saya bisa.

PhilPursglove
sumber
3

Anda juga bisa menjadikannya langkah pasca-pembangunan. Setup konfigurasi baru yang merupakan "Deploy" selain Debug dan Rilis, dan kemudian salin langkah post-build di web.config yang benar.

Kami menggunakan build otomatis untuk semua proyek kami, dan dengan itu script build memperbarui file web.config untuk menunjuk ke lokasi yang benar. Tetapi itu tidak akan membantu Anda jika Anda melakukan semuanya dari VS.

Cory Foy
sumber
3

Ini adalah salah satu manfaat besar menggunakan machine.config. Di pekerjaan terakhir saya, kami memiliki lingkungan pengembangan, pengujian dan produksi. Kita bisa menggunakan machine.config untuk hal-hal seperti string koneksi (ke mesin SQL dev / test / prod yang sesuai).

Ini mungkin bukan solusi bagi Anda jika Anda tidak memiliki akses ke mesin produksi yang sebenarnya (seperti, jika Anda menggunakan perusahaan hosting di host bersama).

Timothy Khouri
sumber
1

Anda juga dapat menggunakan ekstensi "Konfigurasi Konfigurasi" bekerja sama dengan "SlowCheetah",

Parth Kale
sumber
ya itu bekerja tetapi hanya pada penyebaran, bukan pada kompilasi, saya berharap saya bisa mengkompilasi dan men-debug menggunakan lingkungan konfigurasi config yang berbeda
Ch'nycos