IISExpress ส่งคืนข้อผิดพลาด 503 จากเครื่องระยะไกล


183

ฉันกำลังพยายามทดสอบเว็บไซต์ที่ฉันใช้งานในอินสแตนซ์ IISExpress ในเครื่องกับอุปกรณ์ / อุปกรณ์อื่น ๆ ในเครือข่ายท้องถิ่นของฉัน ฉันใช้ Win7 Pro อยู่

เมื่อฉันพยายามเรียกดูเครื่องของฉันจากเครื่องอื่นในส่วนเครือข่ายท้องถิ่นของฉันฉันได้รับข้อผิดพลาด 400: ชื่อโฮสต์ไม่ถูกต้อง

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

netsh http add urlacl url=http://mymachinename:50333/ user=everyone

ตอนนี้ฉันได้รับบริการ 503 ข้อผิดพลาดใช้งานไม่ได้

ขณะนี้ Windows Firewall ปิดการทำงานและฉันสามารถเรียกดูอินสแตนซ์ IIS Express ในพื้นที่ของฉันพร้อมที่อยู่ http://localhost:50333

ชิ้นสุดท้ายของปริศนาการตั้งค่านี้คืออะไร?


1
จะเกิดอะไรขึ้นถ้าคุณเรียกดูhttp://mymachinename:50333/ จากคอมพิวเตอร์ของคุณ
พันเอก Panic

1
ปัญหาได้รับการแก้ไขแล้ว ดูคำตอบที่ยอมรับจาก vikomall
Jeff Fritz

1
การสนทนาเชิงลึกของที่นี่: hanselman.com/blog/…
Chris Moschini

3
คุณสามารถติดตั้งส่วนขยาย VS ฟรีของเรา 'Conveyor' เพื่อแก้ไขปัญหานี้market.visualstudio.com/ ...
Jim W กล่าวว่าการคืนสถานะโมนิก้า

คำตอบ:


270

ดูเหมือนว่าคุณไม่มีรายการข้อมูลการเชื่อมโยงในไฟล์ applicationhost.config

  1. เปิดไฟล์ applicationhost.config ของคุณ สถานที่ที่เป็นไปได้คือ:

    • %userprofile%\Documents\IISExpress\config\applicationhost.config
    • $(solutionDir)\.vs\config\applicationhost.config (VS2015)
    • ตรวจสอบผลลัพธ์จากiisexpress.exeเพื่อให้แน่ใจ
  2. ค้นหารายการเว็บไซต์ของคุณและเพิ่มการเชื่อมโยงดังต่อไปนี้ด้วยชื่อเครื่องของคุณ

         <binding protocol="http" bindingInformation=":50333:your-machine-name" />
    
  3. เริ่มต้น IIS Express


9
ไม่เป็นไร. Visual Studio สร้างรายการกำหนดค่าที่ซ้ำกันสำหรับรายการ ฉันลบมันแล้วมันใช้งานได้
nuzzolilo

3
IIS Express ไม่ได้ใช้ไฟล์กำหนดค่าที่พา ธ นั้นเสมอไป อ่านเอาต์พุตiisexpress.exeอย่างระมัดระวังเพื่อดูว่าไฟล์ config ใดที่ใช้อยู่
พันเอก Panic

5
รายการประเด็นที่ 3 เริ่มต้น IIS Express ใหม่! หาไอคอนในถาดระบบของคุณและหยุดเพื่อบังคับให้รีสตาร์ท ไม่แน่ใจว่ามีวิธีที่สง่างามกว่านี้ไหม แต่สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณ!
สมาชิกวุฒิสภา

9
หากคุณขี้เกียจเกินไปที่จะเพิ่มชื่อโฮสต์ / ipaddress ทุกชุดให้ใช้ * แทน "your-machine-name"
StarQuake

4
อีกคำใบ้หนึ่ง: หากคุณคลิกขวาที่ไอคอน systray ของ IISExpress คุณสามารถเลือก "แสดงแอปพลิเคชันทั้งหมด" ซึ่งจะเปิดกล่องโต้ตอบแสดงแอปพลิเคชันทั้งหมดที่คุณกำลังเรียกใช้อยู่ คลิกขวาที่แอปพลิเคชั่นที่ต้องการ (อย่าคลิกซ้ายมิเช่นนั้นจะเปิดเบราว์เซอร์) จากนั้นคุณจะเห็น "เส้นทาง" และ "กำหนดค่า" ด้านล่าง คลิกซ้ายที่ "Config" และจะเปิดไฟล์ Applicationhost.config ที่เกี่ยวข้องที่คุณต้องการเพิ่ม / แก้ไขการผูกตามที่อธิบายไว้ข้างต้น นั่นเป็นวิธีที่ง่ายในการค้นหาการกำหนดค่าปัจจุบัน
Matt

31

มีเพียง 1 สิ่งที่เหมาะกับฉัน

การใช้ *:portnumber:*ไม่ดี ใช่หลังจากทำเช่นนั้นและทำให้แน่ใจว่า Windows Firewall เปิดอยู่ฉันสามารถเชื่อมต่อกับพอร์ตได้ แต่ฉันยังได้รับข้อผิดพลาด "503"

ฉันทดสอบบางสิ่งในพื้นที่และค้นพบว่าhttp: // localhostใช้ได้ผล การใช้ที่อยู่ IP จริง (ไม่ใช่ 127.0.0.1 แต่ตัวอย่างเช่น 192.168.1.50) ยังคงส่งคืน 503 แม้บนเครื่องโลคัล ฉันพยายามใช้ชื่อโฮสต์จริงในการผูก แต่ IIS Express ปฏิเสธที่จะเริ่ม นี่อาจเป็นเรื่องเกี่ยวกับการแก้ไขชื่อโฮสต์ ฉันไม่ได้สำรวจต่อไป

ในที่สุดฉันก็ลงเอยด้วยการกำหนดค่านี้:

<binding protocol="http" bindingInformation="*:53351:localhost" />
<binding protocol="http" bindingInformation="192.168.1.50:53351:*" />

http://192.168.1.50:53351ในแบบที่ผมสามารถที่จะเชื่อมต่อจากระยะไกลโดยใช้เครื่อง


ฉันพบข้อผิดพลาดที่แน่นอนนี้ แต่ไม่ต้องการรหัสฮาร์ด IP ปัจจุบันในการกำหนดค่าเนื่องจากสามารถเปลี่ยนแปลงได้ ฉันพบว่าสัญลักษณ์แทนทำงานบนส่วน IP และชื่อโฮสต์ดังนั้นฉันจึงลงเอยด้วย: <binding protocol="https" bindingInformation="*:44300:*" /> <binding protocol="http" bindingInformation="*:8888:*" /> edit: พยายามเข้าใจ markdown SO จริงๆฉันออก :)
Brian Barker

19

หลังจากเสียเวลามากกว่า 3 ชั่วโมงในเรื่องเต็มฉันตัดสินใจแบ่งปันการตั้งค่าของฉันกับคุณ การกำหนดค่าของฉันคือ Visual Express 2012 สำหรับการอัปเดตเว็บ 4 บน windows 8 นี่เป็นครั้งแรกที่ฉันกลับมาที่ MS VS นับตั้งแต่การศึกษา (อย่างน้อย 8 ปี) และตอนนี้ฉันแน่ใจว่ากฎ linux บน django การตั้งค่าแบบนี้ใช้เวลา 10 นาทีในการค้นหาเอกสาร

  1. ปิดไฟร์วอลล์เพื่อทำการทดสอบ

    netsh advfirewall set allprofiles state off
    
  2. การเชื่อมโยงการตั้งค่าในกรณีที่อยู่ในท้องถิ่นของฉันคือ localIP = 192.168.1.102 (เนื่องจากลิงก์ไม่สามารถมีโดเมนที่ไม่ใช่ตัวเลขให้ใช้ที่ด้านล่างแทน mylocaldomain.com ดูนโยบาย stackoverflow) ใน Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    
  3. เพิ่มการทำงานอัตโนมัติสำหรับบริการเริ่มต้นของ ISS Express โดยอัตโนมัติ

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    
  4. เพิ่มกฎแปลก ๆ ให้กับเซิร์ฟเวอร์ http (ฉันยังไม่รู้ว่านี่เป็นสิ่งจำเป็นหรือไม่)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    
  5. เรียกใช้ IISExpress ด้วยตนเองไม่ใช่จาก VS IDE

  6. คุณจะเห็นว่า ISSExpress กำลังลงทะเบียนการเชื่อมโยง
  7. เรียกใช้เบราว์เซอร์ http://mylocaldomain.com:53351 หากทำงานแล้วเราสามารถเพิ่มกฎไฟร์วอลล์
  8. เพิ่มกฎไฟร์วอลล์

    netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=53351 remoteip=any action=allow
    

ตั้งค่า remoteip เป็นถ้าคุณต้องการเข้าถึงเซิร์ฟเวอร์ของคุณจากโลกภายนอกถ้าคุณต้องการเข้าถึงเครือข่ายท้องถิ่นใช้ localsubnet

  1. เริ่มไฟร์วอลล์

    netsh advfirewall set allprofiles state on
    
  2. ตรวจสอบอีกครั้งว่าทุกอย่างทำงานได้ทั้งในท้องถิ่นและสาธารณะ

ขอให้คุณโชคดี

Rafal


3
สิ่งนี้ทำให้ IIS Express ไม่สามารถทำงานบน Win8 ด้วย VS2013 ได้อีกต่อไปโดยไม่ต้องใช้ VS2013 ในฐานะผู้ดูแลระบบ สาเหตุเกิดจาก IIS Express พยายามเปิดการรับส่งข้อมูลภายนอกซึ่งเป็นผลมาจากคำสั่ง netsh ฉันไม่เคยได้รับมันจริง ๆ เพื่อรับส่งข้อมูลนั้น ฉันจะได้รับ 503 เพื่อย้อนกลับปัญหาที่เกิดจากคำสั่ง netsh ในคำตอบนี้ให้เรียกใช้จาก Command Prompt ที่ทำงานเป็นผู้ดูแลระบบ: netsh http delete urlacl url=http://*:55416/(แทนที่พอร์ตด้วยพอร์ตของคุณ)
Chris Moschini

fwiw - ฉันไม่ต้องการขั้นตอนที่ 4 (การเรียก netsh ที่ @Rafal ไม่แน่ใจว่าจำเป็น) และถึงแม้ว่าฉันไม่ต้องการการผูก "localhost" ในขั้นตอนที่ 2 เพื่อเรียกใช้โครงการ VS2013 ในโซลูชันของฉัน ท้ายโหลดเร็วขึ้นอย่างมากเมื่อมีการผูก "localhost" ไว้
lukkea

localhostฉันพบว่าทำตามคำแนะนำข้างต้นยังคงมีผลในการใช้ 503 ฉันพบว่าผู้เข้าพัก (Windows) ชื่อเครื่องที่จำเป็นที่จะอยู่ในการผูกในapplicationhost.configและบนโฮสต์ (Mac) ชื่อเครื่องของผู้เข้าพักที่จำเป็นในการแมปไปใน127.0.0.1 /etc/hostsจากนั้นทำการร้องขอไปยังเครื่องเกสต์บนโฮสต์สำเร็จ
Matt

อีกหนึ่งขั้นตอนที่ 5 ใช้ iisexpress.exe / siteid: id โดยที่ id คือค่าของแอตทริบิวต์ id ของไซต์ของคุณในการตั้งค่า <site id = "id"> มิฉะนั้นจะเริ่มต้นไซต์ที่ 1
Mudit Jain

9

พบปัญหาเกี่ยวกับการทำแผนที่ urlacl ที่ไม่ดี เพื่อคิดออก:

netsh http show urlacl 

และมองหาสิ่งต่าง ๆ เช่น http://+:80/หรือพอร์ตที่คุณผูกพัน

จากนั้นใช้

netsh http delete url=<the url from the list>

นี่เป็นการแก้ไขปัญหาสำหรับฉัน


4
ควรเป็น netsh http ลบ urlacl url = <url จากรายการ> สิ่งนี้ใช้ได้กับฉันขอบคุณ!
sergiogx

1
นี้จะกล่าวถึงในรายละเอียดเพิ่มเติมเกี่ยวกับบล็อก MSDN ในที่สุดนี่ก็เป็นปัญหาของฉันเช่นกัน
Kevin Scharnhorst

3
ขอบคุณไวยากรณ์ที่แน่นอนคือnetsh http delete urlacl <yoururl>
yoel halb

7

ไม่มีอะไรทำงานให้ฉัน ในที่สุดฉันก็พบพร็อกซี iisexpress

ดูคำตอบของฉันhttps://stackoverflow.com/a/33623399/631527

อีกวิธีคือ ngrok


! ที่น่าตื่นตาตื่นใจ ฉันลองวิธีแก้ปัญหาอื่น ๆ ทั้งหมดแล้วพวกเขาก็ไม่ได้ผลเช่นกัน "คำขอไม่ถูกต้อง" หรือ "บริการไม่พร้อมใช้งาน" ซับซ้อนเกินไป. ฉันติดตั้งโหนดโมดูลและรันมันใช้งานได้ทันที !!
TetraDev

Works! ศักดิ์สิทธิ์! ขอบคุณ!
Ayson Baxter

ลองดู ngrok ด้วย
Toolkit

1
มันง่ายเหมือนจับใจกับ ngrok! มันแปลกที่ต้องกำหนดเส้นทางแรกจาก localhost ไปยัง iis-proxy และจาก proxy ไปยัง ngrok แต่เดี๋ยวก่อนทำงาน! ตัวอย่างเช่นผมมี iisexpress 3028ของฉันในพอร์ต ฉันวิ่งแล้วiisexpress-proxy 3028 to 12345 ./ngrok.exe http 12345😅
Reuel Ribeiro

@ TetraDev "คำขอไม่ถูกต้อง" หรือ "บริการไม่พร้อมใช้งาน" เป็นเพราะส่วนหัวของโฮสต์ที่ได้รับเมื่อเรียกใช้ localhost จาก ngrok ไม่ใช่ localhost หนึ่งตามที่อธิบายไว้ที่นี่
Dani Torres

3

สิ่งที่ช่วยฉันได้คือคลิกขวาที่ไอคอน 'IISExpress' 'แสดงแอปพลิเคชันทั้งหมด' จากนั้นเลือกเว็บไซต์และฉันเห็นว่ามันใช้ aplicationhost.config และการแก้ไขก็สมบูรณ์แบบ

การกำหนดค่า IISExpress


1

ปัญหาคือการอัปเดตไฟล์ applicationhost.config ภายในเว็บโฟลเดอร์แทนวิธีแก้ไขปัญหา ไฟล์กำหนดค่าโซลูชันเป็นไฟล์ที่จะเปลี่ยนแปลง


1

หลังจากวิธีแก้ปัญหาของ @vikomall อย่าลืมเริ่มต้น VS เป็นผู้ดูแลระบบ การแก้ไขนี้สำหรับฉัน


0

เกี่ยวกับคำตอบของ Anthony Rizzolo: ใน Windows 8.1 ฉันต้องพิมพ์ดังนี้

netsh http delete urlacl url=<the url from the list>

ตัวอย่างเช่น:

netsh http delete urlacl url=http://+:8689/

0

ไม่มีคำตอบข้างต้นสำหรับฉัน

ฉันมีรายการสองรายการในมุ้งสำหรับบริการเดียวกัน

netsh http show urlacl

ป้อนคำอธิบายรูปภาพที่นี่

หนึ่งที่ใช้ไวด์การ์ดที่แข็งแกร่งและอีกอันหนึ่งใช้ไวด์การ์ดที่อ่อนแอ

การลบอันที่มีไวลด์การ์ดที่อ่อนแอออกทำงานได้

เพิ่มเติมเกี่ยวกับสัญลักษณ์ตัวแทนที่แข็งแกร่งและอ่อนแอในบริบทของ netsh

เมื่อองค์ประกอบโฮสต์ของ UrlPrefix ประกอบด้วยเครื่องหมายบวก (+) เดียว UrlPrefix จะจับคู่ชื่อโฮสต์ที่เป็นไปได้ทั้งหมดในบริบทของแบบแผนพอร์ตและองค์ประกอบญาติและเข้าสู่หมวดตัวแทนที่แข็งแกร่ง

เมื่อเครื่องหมายดอกจัน (*) ปรากฏขึ้นเป็นองค์ประกอบโฮสต์แล้ว UrlPrefix จะอยู่ในหมวดหมู่สัญลักษณ์ตัวแทนอ่อน UrlPrefix ชนิดนี้ตรงกับชื่อโฮสต์ใด ๆ ที่เชื่อมโยงกับแบบแผนพอร์ตและสัมพัทธ์ที่ระบุซึ่งยังไม่ได้รับการจับคู่โดย strong-wildcard, ชัดแจ้ง, หรือ IP-weak-wildcard UrlPrefix ข้อกำหนดคุณสมบัติของโฮสต์นี้สามารถใช้เป็นค่าเริ่มต้น catch-all ในบางสถานการณ์หรือสามารถใช้เพื่อระบุส่วนใหญ่ของเนมสเปซ URL โดยไม่ต้องใช้ UrlPrefixes จำนวนมาก

https://docs.microsoft.com/en-gb/windows/desktop/Http/urlprefix-strings

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