ตรวจพบการตั้งค่า ASP.NET ที่ไม่ได้ใช้ในโหมดขั้นตอนการจัดการแบบรวม


401

ฉันติดตั้ง DotNetOpenAuth SDK-3.4.5.10201.vsix และฉันไม่สามารถทำงานได้ มันทำงานในท้องถิ่น (เมื่อฉันเรียกใช้เป็น localhost) แต่เมื่อฉันพยายามที่จะเผยแพร่มันไม่ทำงาน

ข้อความแสดงข้อผิดพลาด IIS ที่ฉันได้รับคือ

สรุปข้อผิดพลาด
HTTP ข้อผิดพลาด 500.22 - ข้อผิดพลาดเซิร์ฟเวอร์ภายใน
ตรวจพบการตั้งค่า ASP.NET ที่ไม่ได้ใช้ในโหมดขั้นตอนที่ได้รับการจัดการรวม

และ

Module       ConfigurationValidationModule  
Notification BeginRequest  
Handler      StaticFile  
Error Code   0x80070032  

จากนั้นมีคำแนะนำเกี่ยวกับวิธีการแก้ปัญหา:

สิ่งที่คุณสามารถลอง:

  • โอนย้ายการกำหนดค่าไปยัง system.webServer/modulesส่วน คุณสามารถทำได้ด้วยตนเองหรือโดยใช้ appcmd จากบรรทัดคำสั่ง - %SystemRoot%\system32\inetsrv\appcmd migrate config "Default Web Site/"ยกตัวอย่างเช่น การใช้AppCmdเพื่อย้ายข้อมูลแอปพลิเคชันของคุณจะช่วยให้แอปพลิเคชันทำงานในโหมดรวมและทำงานต่อในโหมดคลาสสิคและ IIS รุ่นก่อนหน้า

  • หากคุณมั่นใจว่าสามารถเพิกเฉยข้อผิดพลาดนี้ได้คุณสามารถปิดใช้งานได้โดยตั้งค่า system.webServer/validation@validateIntegratedModeConfiguration เป็นเท็จ

  • ผลัดกันสลับไปประยุกต์ใช้ในการสระว่ายน้ำแอปพลิเคโหมดคลาสสิก - %SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool"ยกตัวอย่างเช่น ทำเช่นนี้ต่อเมื่อคุณไม่สามารถโอนย้ายแอปพลิเคชันของคุณ
    (ตั้งค่า "เว็บไซต์เริ่มต้น" และ "Classic .NET AppPool" เป็นพา ธ แอปพลิเคชันของคุณและชื่อกลุ่มแอปพลิเคชัน)

แต่ปัญหาคือฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ ISS ได้เนื่องจากฉันไม่ใช่เจ้าของ มีวิธีแก้ปัญหานี้ไหม?

คำตอบ:


782

2 ครั้งเป็นตัวเลือกหนึ่งที่คุณต้องการ

ในของคุณweb.configต้องแน่ใจว่ามีปุ่มเหล่านี้อยู่:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

10
สิ่งนี้ไม่ควรส่งผลกระทบต่อความปลอดภัยของแอพของคุณ เพียงแค่ปิดคำเตือนที่แจ้งว่าคุณมีค่าการกำหนดค่าบางอย่างที่จะไม่ใช้
เดวิด

19
นี่ไม่ใช่คำแนะนำที่ฟังดูเกินจริงหากคุณมีการตั้งค่าที่จะไม่ใช้งานคุณควรลบออก
Seph

33
@Seph ไม่เห็นด้วยว่านี่ไม่ใช่คำแนะนำที่ดี การติดตั้ง NuGet จำนวนมาก (เช่น DotLess) จะเพิ่มรายการในส่วนที่ใช้กับโหมดรวมและทำซ้ำการตั้งค่าสำหรับโหมดที่ไม่รวม สิ่งนี้เรียกว่าการพกพาและอนุญาตให้การกำหนดค่าของคุณทำงานโดยไม่คำนึงว่าคุณใช้ IIS7 / รวมหรือแบบดั้งเดิม เหตุผลเดียวที่จะทำให้การตั้งค่าการตรวจสอบความถูกต้องนี้trueคือเพื่อให้คุณสามารถเปิดการฝึกอบรมและเปิดใช้งาน IIS ตะโกนใส่คุณทุกครั้งที่คุณเพิ่มการตั้งค่าที่จะไม่ทำงานในโหมดรวม นี่คือประสบการณ์ที่ไม่มีประสบการณ์ แต่ได้รับในทาง
Kirk Woll

5
การกำหนดค่าชนิดนี้น่ารำคาญ @MS: มีวิธีที่ดีกว่า
yonexbat

3
สำหรับผู้ที่ต้องการแก้ไขข้อผิดพลาดมากกว่าอาการกำบังฉันได้โพสต์คำตอบอื่น เกี่ยวกับแพคเกจ NuGet ทำไมเราถึงยังตั้งเป้าหมาย IIS 6 / Classic?
Jeremy Cook

104

การเพิ่ม<validation validateIntegratedModeConfiguration="false"/>ที่อยู่อาการ แต่ไม่เหมาะสำหรับทุกสถานการณ์ ต้องวิ่งไปรอบ ๆ ปัญหานี้สองสามครั้งฉันหวังว่าจะช่วยให้ผู้อื่นไม่เพียง แต่เอาชนะปัญหา แต่เข้าใจมัน (ซึ่งมีความสำคัญมากขึ้นเรื่อย ๆ เมื่อ IIS 6 จางหายไปจากตำนานและข่าวลือ)

พื้นหลัง:

ปัญหานี้และความสับสนรอบข้างเริ่มต้นด้วยการเปิดตัว ASP.NET 2.0 และ IIS 7 IIS 6 มีและยังคงมีโหมดขั้นตอนเดียวเท่านั้นและจะเทียบเท่ากับสิ่งที่ IIS 7+ เรียกว่าโหมด "คลาสสิค" โหมดขั้นที่สองใหม่กว่าและไปป์ไลน์ที่แนะนำสำหรับแอปพลิเคชันทั้งหมดที่ทำงานบน IIS 7+ เรียกว่าโหมด "รวม"

ดังนั้นความแตกต่างคืออะไร? ความแตกต่างที่สำคัญคือวิธีที่ ASP.NET โต้ตอบกับ IIS

  • โหมดคลาสสิคถูก จำกัด ไว้ที่ไปป์ไลน์ ASP.NET ที่ไม่สามารถโต้ตอบกับ IIS ไปป์ไลน์ เป็นหลักคำขอมาและถ้ามีการบอก IIS 6 / Classic ผ่านการกำหนดค่าเซิร์ฟเวอร์ ASP.NET นั้นสามารถจัดการกับมันได้แล้ว IIS จะส่งคำขอไปยัง ASP.NET และดำเนินการต่อ ความสำคัญของสิ่งนี้สามารถรวบรวมได้จากตัวอย่าง ถ้าฉันจะอนุญาตให้เข้าถึงไฟล์ภาพคงที่ฉันจะไม่สามารถทำได้ด้วยโมดูล ASP.NET เพราะไปป์ไลน์ IIS 6 จะจัดการคำขอเหล่านั้นเองและ ASP.NET จะไม่เห็นคำขอเหล่านั้นเพราะพวกเขาไม่เคยส่งมอบ ในทางกลับกันการให้สิทธิ์ผู้ใช้ที่สามารถเข้าถึงหน้า. ASPX เช่นการร้องขอสำหรับ Foo.aspx นั้นเป็นเรื่องเล็กน้อยแม้ใน IIS 6 / Classic เพราะ IIS มักจะส่งคำขอเหล่านั้นไปยัง ASP.NET ในโหมดคลาสสิค ASP.NET ไม่รู้ว่ามีอะไรบ้าง '

  • แนะนำให้ใช้โหมดรวมเนื่องจากตัวจัดการและโมดูล ASP.NET สามารถโต้ตอบโดยตรงกับไปป์ไลน์ IIS ไปป์ไลน์ IIS ไม่ส่งการร้องขอไปยัง ASP.NET ไปอีกต่อไปตอนนี้อนุญาตให้โค้ด ASP.NET เชื่อมต่อโดยตรงกับไปป์ไลน์ IIS และการร้องขอทั้งหมดที่เข้าชมได้ ซึ่งหมายความว่าโมดูล ASP.NET ไม่เพียง แต่สามารถติดตามการร้องขอไปยังไฟล์อิมเมจแบบคงที่เท่านั้น แต่สามารถดักจับการร้องขอเหล่านั้นและดำเนินการโดยปฏิเสธการเข้าถึงการบันทึกการร้องขอเป็นต้น

การเอาชนะข้อผิดพลาด:

  1. หากคุณใช้แอพพลิเคชั่นรุ่นเก่าที่สร้างขึ้นสำหรับ IIS 6 บางทีคุณอาจย้ายแอปพลิเคชั่นไปยังเซิร์ฟเวอร์ใหม่อาจไม่มีความผิดปกติใด ๆ เกิดขึ้นกับการเรียกใช้พูลแอปพลิเคชันของแอปพลิเคชันนั้นในโหมดคลาสสิก ไปข้างหน้าคุณไม่ต้องรู้สึกแย่
  2. จากนั้นอีกครั้งคุณอาจให้แอปพลิเคชันของคุณหน้าลิฟท์หรือไม่ก็ใช้งานได้ดีจนกว่าคุณจะติดตั้งห้องสมุดบุคคลที่สามผ่าน NuGet ด้วยตนเองหรือโดยวิธีอื่น ในกรณีที่ว่ามันเป็นไปได้ทั้งหมดhttpHandlersหรือได้รับการเพิ่มhttpModules system.webผลเป็นข้อผิดพลาดที่คุณเห็นเพราะค่าเริ่มต้นvalidateIntegratedModeConfiguration trueตอนนี้คุณมีสองทางเลือก:

    1. ถอดhttpHandlersและองค์ประกอบจากhttpModules system.webมีผลลัพธ์ที่เป็นไปได้สองสามข้อจาก:
      • ทุกอย่างทำงานได้ดีผลลัพธ์ที่เหมือนกัน
      • แอปพลิเคชันของคุณยังคงบ่นอาจมี web.config ในโฟลเดอร์พาเรนต์ที่คุณสืบทอดมาพิจารณาการล้าง web.config นั้นเช่นกัน
      • คุณเบื่อที่จะลบออกhttpHandlersและhttpModulesแพ็คเกจ NuGet ยังคงเพิ่มอยู่system.webเฮ้ทำในสิ่งที่คุณต้องการ
  3. หากตัวเลือกเหล่านั้นจะไม่ได้ทำงานหรือมีปัญหามากกว่าที่มันคุ้มค่าแล้วฉันจะไม่บอกคุณว่าคุณไม่สามารถตั้งค่าvalidateIntegratedModeConfigurationการfalseแต่อย่างน้อยคุณรู้ว่าสิ่งที่คุณทำและทำไมมันเป็นเรื่องสำคัญ

อ่านดี:

* แน่นอนว่ามีวิธีที่จะทำให้สิ่งแปลก ๆ เข้าสู่ ASP.NET ไปป์ไลน์จาก IIS 6 / Classic ผ่านทางคาถาเช่นการจับคู่ไวด์การ์ดหากคุณชอบสิ่งนั้น


โซลูชัน +1 อย่างเดียวไม่ใช่คำตอบของปัญหาของคุณ แต่วิธีแก้ปัญหาพร้อมคำอธิบายที่เป็นคำตอบที่สมบูรณ์แบบ มันคืออะไรและทำไมเราต้องเปลี่ยนสิ่งนี้คำถามคำตอบที่ได้รับคำตอบจาก @Jeremy cook
Rikin Patel

คำอธิบายนี้ทำให้ฉันแก้ไขปัญหาสำหรับไซต์ทดสอบขนาดเล็กที่โฮสต์ใน IIS 7.5 ในโหมดรวม เมื่อฉันสร้างโครงการ MVC ใหม่มันเพิ่ม httpModule, Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule ใน Web.config ของฉัน นี่เป็นเพราะฉันออกจากตัวเลือก "เพิ่มแอปพลิเคชันข้อมูลเชิงลึกของโครงการ" ที่เลือกไว้เมื่อสร้างโครงการแอปพลิเคชันเว็บ ASP.NET ใหม่ เมื่อฉันลบ httpModule จาก Web.config ไซต์จะทำงานโดยไม่มีข้อผิดพลาด การตั้งค่า validateIntegratedModeConfiguration ให้เป็นผลงานที่ผิดพลาด แต่นั่นเป็นเพียงวิธีการ bandaid
iCode

2
ตรวจพบการตั้งค่า ASP.NET ที่ไม่ได้ใช้ในโหมดขั้นตอนการจัดการแบบรวม นี่เป็นอีกข้อความข้อผิดพลาด Microsoft ที่ไร้ประโยชน์ ASP.net มีการตั้งค่าหลายพันรายการ แต่ Microsoft ไม่คิดว่าจะรวมการตั้งค่าที่ทำให้เกิดข้อผิดพลาดในข้อความแสดงข้อผิดพลาด MS กำลังดำเนินการโดยนักการตลาดมากกว่าวิศวกรดังนั้นอย่าคาดหวังว่าจะได้รับการปรับปรุงใด ๆ ในไม่ช้า :-(
Paul McCarthy

35

หากคุณยังต้องใช้โมดูล HTTP คุณต้องกำหนดค่า (กรอบงาน. NET 4.0) ดังนี้:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
       <add name="MyModule" type="[Namespace].[Class], [assembly]"/>
   </modules>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

2
ฉันคิดว่าคุณสมบัติ HttpModules ใน system.web สำหรับ ASP 3.5 หรือก่อนหน้านี้ สำหรับ ASP 4 หรือสูงกว่าให้ใช้โมดูลใน system.webserver
Trio Cheung

1
@ HooyCheung เป็นเรื่องของการใช้ Integrated หรือ Classic Pipeline ไม่ใช่รุ่นใดของ. Net ซึ่งตัดสินใจว่าจะใช้ system.web / httpModules หรือ system.webServer / modules
Pauli Østerø

29

ฉันพบปัญหานี้ แต่มีการแก้ไขอื่น มันเกี่ยวข้องกับการปรับปรุงControl Panel>Administrative Tools>IIS Managerและการคืนค่าเว็บไซต์ App ของฉันที่มีการจัดการทางท่อจากไปIntegratedClassic


3
เห็นด้วย - นี่เป็นตัวเลือกที่ดีกว่าแทนที่จะซ่อนข้อผิดพลาด! ตรวจสอบให้แน่ใจว่าคุณใช้แอพพูลที่ถูกต้อง - ควรเป็นแบบคลาสสิคไม่รวม
Swomble

1
ฉันใช้ visual studio 2012 ฉันจะเปลี่ยนแอพเป็นคลาสสิกอย่างไร

10
นี่ไม่ใช่ทางออกที่ดีหากคุณต้องการใช้คุณสมบัติใหม่ทั้งหมดที่มีอยู่ใน Integrated Pipeline นี่เป็นเหมือนการบอกว่าคืนค่าเป็น. NET 2.0 จาก 4.0 เนื่องจากปัญหา
Trevor de Koekkoek

เมื่อต้องการทำเช่นนี้ใน IIS Manager ให้ไปApplication Poolsที่ต้นไม้ทางด้านซ้ายคลิกสองครั้งที่กลุ่มที่คุณต้องการเปลี่ยนและเลือกโหมดไปป์ไลน์
Steve Smith

8

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


5

ในเว็บของคุณให้ตรวจสอบว่ากุญแจเหล่านี้มีอยู่:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

รวมทั้งตรวจสอบAsp.Net Impresonation = Disableใน IIS Authetication ของไซต์ IIS


3

ฉันพบปัญหานี้และได้รับแรงบันดาลใจจากคำตอบของ @Jeremy Cook ฉันใช้กระสุนเล็กน้อยเพื่อค้นหาว่าสิ่งใดที่ทำให้เกิดโหมดแบบรวม IIS 7 ที่ไม่เหมือน web.config ของฉัน นี่คือสถานการณ์ของฉัน:

  1. Web API (รุ่น 4.0.030506.0 หรือที่เก่ากว่า)
  2. .NET 4.0
  3. แอตทริบิวต์การกำหนดเส้นทาง 3.5.6 สำหรับ Web API [การแจ้งเตือนสปอยเลอร์: มันเป็นผู้ชายคนนี้!]

ฉันต้องการใช้การกำหนดเส้นทางแอตทริบิวต์ในโครงการที่ (น่าเสียดาย) ต้องใช้. NET 4 และดังนั้นจึงไม่สามารถใช้ Web API 2.2 (ซึ่งต้องการ. NET 4.5) แพ็คเกจ NuGet ที่มีความหมายดีได้เพิ่มหัวข้อนี้ใน<system.web>ส่วน:

<system.web>
<httpHandlers>
      <add verb="*" path="routes.axd" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
    </httpHandlers>
</system.web>

[ฉันบอกว่ามีความหมายดีเพราะส่วนนี้เป็นสิ่งจำเป็นสำหรับ IIS รุ่นเก่า]

การลบส่วนนี้ให้ฉันผ่าน HTTP 500.23 !!

สรุป: ฉันสองคำของ Jeremy ที่เป็นสิ่งสำคัญที่จะเข้าใจว่าทำไมสิ่งต่าง ๆ ไม่ทำงานมากกว่าเพียงแค่ "กำบังอาการ" แม้ว่าคุณจะต้องปิดบังอาการคุณก็รู้ว่าคุณกำลังทำอะไรอยู่ (และทำไม) :-)


ขอบคุณ ฉันได้เพิ่ม AttributeRouting รวมถึงแพ็คเกจเสริมของ Api Controller NuGet และลบส่วนที่คุณระบุจาก web.config เพื่อแก้ไขปัญหา อย่างไรก็ตามฉันกังวลเล็กน้อยเพราะแอปพลิเคชันเว็บ MVC ของฉันใช้งานแล้ว NET Framework 4.5
Robert Oschler

2
@RobertOschler หากคุณใช้. NET 4.5 อยู่แล้วคุณมีการกำหนดเส้นทางแอตทริบิวต์ใน AFAIK แล้วคุณไม่จำเป็นต้องใช้ NuGet นี้หรือ
Sudhanshu Mishra

ขอบคุณและอึ วันนี้มีไม่กี่ชั่วโมงที่ได้รับแพ็คเกจ AttributeRouting ที่เรียกใช้ NuGet ฉันดึงมันออกแล้วเลิกแก้รหัส "แก้ไข" ทั้งหมดที่ฉันเพิ่มเพื่อให้ทำงานได้และแทนที่แอตทริบิวต์ Web API 2 Route () สำหรับแอตทริบิวต์ GET () ใช้งานได้ดีมาก วันนี้เราต้องการระบบผู้เชี่ยวชาญเพื่อช่วยเราจัดทำแพ็คเกจเหล่านี้ทั้งหมด
Robert Oschler

2

สิ่งนี้ใช้ได้กับฉัน:

  1. ลบไซต์ที่สร้างขึ้นในตอนแรก
  2. สร้างไซต์ใน IIS อีกครั้ง
  3. น้ำยาทำความสะอาด
  4. สร้างโซลูชัน

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


0

ในกรณีของฉันฉันหายไป dll ในโฟลเดอร์ bin ซึ่งถูกอ้างอิงในไฟล์ web.config ดังนั้นตรวจสอบว่าคุณใช้การตั้งค่าใด ๆ ใน web.config แต่จริง ๆ แล้วไม่มี dll

ขอบคุณ


0

ฉันใช้เวลาสองสามชั่วโมงในการแก้ไขปัญหานี้เนื่องจากการตั้งค่าทั้งหมดที่ฉันพบที่นี่เกี่ยวกับข้อผิดพลาดนี้เหมือนกัน แต่ก็ยังไม่ทำงาน ปัญหาคือ tha ฉันมีโฟลเดอร์ในบริการเว็บของฉันซึ่งไฟล์ควรถูกส่งไปยังอุปกรณ์ WinCE หลังจากแปลงโฟลเดอร์นั้นเป็นแอปพลิเคชันด้วย Classic.NetAppPool มันเริ่มทำงาน


0

ด้านล่างขั้นตอนแก้ไขปัญหาของฉัน:

เปิดCMDพร้อมรับคำด้วยสิทธิ์ของผู้ดูแลระบบ

วิ่ง : iisreset.

หวังว่านี่จะช่วยได้


-1

วิธีการในท้องถิ่นมีข้อผิดพลาด

ภาพ


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