ใช้ Web.config ที่แตกต่างกันในการพัฒนาและสภาพแวดล้อมการผลิต


194

ฉันต้องใช้สตริงการเชื่อมต่อฐานข้อมูลที่แตกต่างกันและที่อยู่เซิร์ฟเวอร์ SMTP ในแอปพลิเคชัน ASP.NET ของฉันขึ้นอยู่กับว่ามันทำงานในสภาพแวดล้อมการพัฒนาหรือการผลิต

แอปพลิเคชันอ่านการตั้งค่าจากไฟล์ Web.config ผ่านคุณสมบัติWebConfigurationManager.AppSettings

ฉันใช้คำสั่ง Build / Publish เพื่อปรับใช้แอปพลิเคชันไปยังเซิร์ฟเวอร์ที่ใช้งานจริงผ่านทาง FTP จากนั้นแทนที่ Web.config ระยะไกลด้วยตนเองให้ถูกต้อง

เป็นไปได้หรือไม่ที่จะทำให้กระบวนการปรับใช้ง่ายขึ้น? ขอบคุณ!

คำตอบ:


159

ใน Visual Studio 2010 และสูงกว่าตอนนี้คุณมีความสามารถในการใช้การแปลงกับเว็บของคุณกำหนดค่าขึ้นอยู่กับการกำหนดค่าการสร้าง

เมื่อสร้าง web.config คุณสามารถขยายไฟล์ในตัวสำรวจโซลูชันและคุณจะเห็นสองไฟล์:

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

พวกเขามีรหัสการแปลงที่สามารถใช้

  • เปลี่ยนสตริงการเชื่อมต่อ
  • ลบการติดตามการดีบักและการตั้งค่า
  • ลงทะเบียนหน้าข้อผิดพลาด

ดูไวยากรณ์การแปลง Web.config สำหรับการปรับใช้โครงการเว็บแอปพลิเคชันบน MSDN สำหรับข้อมูลเพิ่มเติม

นอกจากนี้ยังเป็นไปได้แม้ว่าจะไม่ได้รับการสนับสนุนอย่างเป็นทางการแม้ว่าจะใช้การแปลงแบบเดียวกันกับapp.configไฟล์ที่ไม่ใช่เว็บแอปพลิเคชันก็ตาม ดูบล็อก Phil Bolducเกี่ยวกับวิธีแก้ไขไฟล์โครงการของคุณเพื่อเพิ่มงานใหม่ใน msbuild

นี่คือการต่อสู้นานคำขอใน Visual Studio uservoice

ส่วนขยายสำหรับ Visual Studio 2010และสูงกว่า " SlowCheetah " สามารถใช้ได้ในการดูแลของการสร้างแปลงสำหรับไฟล์ config ใด ๆ เริ่มต้นด้วย Visual Studio 2017.3, SlowCheetah ได้รับการรวมเข้ากับ IDEและฐานรหัสจะถูกจัดการโดย Microsoft เวอร์ชั่นใหม่นี้รองรับการแปลง JSON


7
โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับโครงการเว็บไซต์เก่า สำหรับเว็บแอปพลิเคชันเท่านั้น ฉันไม่ได้ลองดูว่าวิธีแก้ปัญหาของ Phil Bolduc ใช้ได้กับเว็บไซต์หรือไม่ แต่ฉันคิดว่ามันจะไม่เกิดขึ้นเพราะพวกเขาไม่มีไฟล์โครงการ
โม

13
นอกจากนี้โปรดทราบว่าการแปลง web.confg ใช้สำหรับเผยแพร่เท่านั้นพวกเขาจะไม่ทำงานหากคุณเพียงแค่สร้าง / เรียกใช้ F5: (((((
อเล็กซ์

7
หาก web.config ของคุณไม่ได้มีWeb.Debug.ConfigและWeb.Release.Configคุณอาจจะต้องคลิกขวาและคลิกWeb.Config Add Config Transforms
Doug S

1
@Alex: เราจะใช้มันเพื่อ build / F5 ได้อย่างไร?
นักพนัน

1
เชื่อมโยงโดยตรงกับ SlowCheetah: marketplace.visualstudio.com/...
เสี่ยว

83

<appSettings>แท็กใน web.config สนับสนุนแอตทริบิวต์แฟ้มที่จะโหลดการตั้งค่าภายนอกกับชุดของตัวเองของคีย์ / ค่า สิ่งเหล่านี้จะแทนที่การตั้งค่าใด ๆ ที่คุณมีใน web.config หรือเพิ่มลงไป

เราใช้ประโยชน์จากสิ่งนี้โดยปรับเปลี่ยน web.config ของเราในเวลาติดตั้งด้วยแอตทริบิวต์ของไฟล์ที่ตรงกับสภาพแวดล้อมที่เว็บไซต์กำลังติดตั้ง เราทำสิ่งนี้ด้วยสวิตช์ตัวติดตั้งของเรา

เช่น;

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

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

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

บันทึก:

  • การเปลี่ยนแปลง. config ที่ระบุโดยแอ็ตทริบิวต์จะไม่ทำให้เกิดการรีสตาร์ทกระบวนการ asp.net worker

2
นี่เป็นคำตอบที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งเมื่อคุณมีสภาพแวดล้อมจำนวนมากและการตั้งค่าบางอย่างสำหรับสภาพแวดล้อมบางอย่างมีรหัสผ่านและสิ่งที่คล้ายกันซึ่งคุณไม่ต้องการติดตามในการควบคุมแหล่งที่มา
Phil

1
มีวิธีแบบไดนามิกในการเปลี่ยนเส้นทางของไฟล์หรือไม่? ขึ้นอยู่กับว่าคุณอยู่บนเซิร์ฟเวอร์ใด เพียงแค่ทราบด้านนี้ทำงานในโครงการเว็บไซต์เก่าไม่ใช่เว็บแอปพลิเคชัน ขอบคุณมาก!
มุมมอง

2
มีแอตทริบิวต์restartOnExternalChangesที่จะจัดการไฟล์เหล่านั้นราวกับว่าเป็น web.configs ที่มา: learnable.com/books/…
David Schwartz

24

คุณเคยดูโครงการปรับใช้เว็บหรือไม่?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

มีรุ่นสำหรับ VS2005 เช่นกันหากคุณไม่ได้อยู่ในปี 2008


นี่คือคำแนะนำที่ดีสำหรับการใช้โครงการปรับใช้เว็บ: johnnycoder.com/blog/2010/01/07/…
Gary W

โครงการปรับใช้เว็บดูเหมือนจะเป็น VS "การเผยแพร่โปรไฟล์" ตอนนี้Diaryofaninja.com/blog/2012/08/26/…
jocull

13

ฉันก็อยากจะรู้เช่นกัน สิ่งนี้ช่วยแยกปัญหาให้ฉันได้

<connectionStrings configSource = "connectionStrings.config" />

จากนั้นฉันจะทำการเชื่อมต่อ connectionStrings.config เช่นเดียวกับ "{host} connectionStrings.config" มันยังคงเป็นปัญหาอยู่ แต่ถ้าคุณทำเช่นนี้สำหรับส่วนที่แตกต่างกันในสองสภาพแวดล้อมคุณสามารถปรับใช้และกำหนดเวอร์ชัน web.config เดียวกัน

(และฉันไม่ได้ใช้ VS, btw.)


หากคุณกำลังใช้ VS คุณสามารถใช้ prebuild-events เพื่อคัดลอกจาก debug.connectionstrings.config หรือ release.connectionstrings.config เช่น: คัดลอก $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config ตามที่แนะนำ โดย Scott Hanselmann: hanselman.com/blog/…
Thomas

6

ฉันใช้ NAnt Build Script เพื่อปรับใช้กับสภาพแวดล้อมที่แตกต่างกันของฉัน ฉันมีมันแก้ไข config ไฟล์ของฉันผ่าน XPath ขึ้นอยู่กับที่พวกเขากำลังถูกนำไปใช้แล้วมันจะทำให้พวกเขาโดยอัตโนมัติในสภาพแวดล้อมที่ใช้Beyond เปรียบเทียบ

ใช้เวลาหนึ่งหรือสองนาทีในการตั้งค่า แต่คุณจะต้องทำเพียงครั้งเดียว จากนั้นไฟล์แบทช์จะเข้ามาแทนที่ในขณะที่ฉันไปรับกาแฟอีกหนึ่งถ้วย :)

นี่คือบทความที่ฉันพบในมัน


5

ในโครงการหนึ่งที่เรามี 4 สภาพแวดล้อม (การพัฒนาการทดสอบการจัดเตรียมและการผลิต) เราพัฒนาระบบที่แอปพลิเคชันเลือกการกำหนดค่าที่เหมาะสมตามชื่อเครื่องที่ถูกปรับใช้

สิ่งนี้ใช้ได้กับเราเพราะ:

  • ผู้ดูแลระบบสามารถปรับใช้แอปพลิเคชันโดยไม่เกี่ยวข้องกับนักพัฒนา (ข้อกำหนด) และโดยไม่ต้องเล่นซอกับไฟล์กำหนดค่า (ที่พวกเขาเกลียด)
  • ชื่อเครื่องปฏิบัติตามอนุสัญญา เราจับคู่ชื่อโดยใช้นิพจน์ทั่วไปและปรับใช้กับเครื่องหลายเครื่องในสภาพแวดล้อม และ
  • เราใช้การรักษาความปลอดภัยแบบรวมสำหรับสตริงการเชื่อมต่อ ซึ่งหมายความว่าเราสามารถเก็บชื่อบัญชีไว้ในไฟล์กำหนดค่าของเราได้ในเวลาออกแบบโดยไม่เปิดเผยรหัสผ่านใด ๆ

มันทำงานได้ดีสำหรับเราในกรณีนี้ แต่อาจจะไม่ทำงานทุกที่


3

เครื่องมือแก้ไขการกำหนดค่า Enterprise Library สามารถช่วยคุณทำสิ่งนี้ได้ ช่วยให้คุณสามารถสร้างไฟล์กำหนดค่าพื้นฐานและจากนั้นให้ลบสำหรับแต่ละสภาพแวดล้อม จากนั้นคุณสามารถรวมการกำหนดค่าฐานและเดลต้าเพื่อสร้าง web.config เฉพาะสภาพแวดล้อม ดูข้อมูลที่นี่ซึ่งจะนำคุณผ่านมันได้ดีกว่าที่ฉันสามารถทำได้


3

คุณสามารถทำให้เป็นขั้นตอนหลังการสร้างได้ ตั้งค่าการกำหนดค่าใหม่ซึ่งเป็น "การปรับใช้" นอกเหนือจาก Debug and Release แล้วให้คัดลอกขั้นตอน post-build ผ่าน web.config ที่ถูกต้อง

เราใช้การสร้างอัตโนมัติสำหรับโครงการทั้งหมดของเราและด้วยการสร้างสคริปต์การปรับปรุงไฟล์ web.config เพื่อชี้ไปที่ตำแหน่งที่ถูกต้อง แต่นั่นจะไม่ช่วยคุณถ้าคุณทำทุกอย่างจาก VS


3

นี่คือหนึ่งในผลประโยชน์มหาศาลของการใช้ machine.config ในงานสุดท้ายของฉันเรามีสภาพแวดล้อมการพัฒนาการทดสอบและการผลิต เราสามารถใช้ machine.config สำหรับสิ่งต่างๆเช่นสตริงการเชื่อมต่อ (ไปยังเครื่อง SQL dev / test / prod ที่เหมาะสม)

นี่อาจไม่ใช่วิธีแก้ปัญหาสำหรับคุณหากคุณไม่สามารถเข้าถึงเครื่องผลิตจริง (เช่นถ้าคุณใช้ บริษัท ให้บริการโฮสต์บนโฮสต์ที่ใช้ร่วมกัน)


1

นอกจากนี้คุณยังสามารถใช้ส่วนขยาย "การแปลงการกำหนดค่า" ได้เช่นเดียวกับ "SlowCheetah"


ใช่มันใช้งานได้ แต่เฉพาะในการปรับใช้ไม่ใช่การคอมไพล์ฉันหวังว่าฉันจะสามารถรวบรวมและดีบักได้โดยใช้สภาพแวดล้อมการแปลงสภาพที่แตกต่างกัน
Ch'nycos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.