IISExpress mengembalikan kesalahan 503 dari mesin jarak jauh

183

Saya mencoba menguji situs web yang saya jalankan dalam contoh IISExpress lokal dengan beberapa mesin / perangkat lain di jaringan lokal saya. Saya menjalankan Win7 Pro.

Ketika saya pertama kali mencoba menjelajah ke komputer saya dari komputer lain di segmen jaringan lokal saya, saya mendapatkan kesalahan 400: Nama host tidak valid.

Saya mengerti bahwa saya perlu memberikan akses jarak jauh ke ACL dengan perintah pada prompt perintah yang ditinggikan seperti:

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

Sekarang saya mendapatkan layanan 503 kesalahan tidak tersedia.

Windows Firewall saat ini dimatikan, dan saya dapat menelusuri contoh IISExpress lokal saya dengan alamatnya http://localhost:50333

Apa bagian terakhir dari puzzle konfigurasi ini?

Jeff Fritz
sumber
1
Apa yang terjadi jika Anda menjelajah ke http://mymachinename:50333/ dari komputer Anda ?
Kolonel Panic
1
Masalahnya telah diatasi. Lihat jawaban yang diterima dari vikomall
Jeff Fritz
1
Diskusi yang lebih mendalam
Chris Moschini
3
Anda dapat menginstal ekstensi VS 'Conveyor' gratis kami untuk mengatasi masalah ini marketplace.visualstudio.com/...
Jim W mengatakan mengembalikan Monica

Jawaban:

270

Sepertinya Anda kehilangan entri informasi yang mengikat dalam file applicationhost.config.

  1. Buka file applicationhost.config Anda. Lokasi yang mungkin adalah:

    • %userprofile%\Documents\IISExpress\config\applicationhost.config
    • $(solutionDir)\.vs\config\applicationhost.config (VS2015)
    • Gagal itu, periksa output dari iisexpress.exeuntuk memastikan.
  2. Temukan entri WebSite Anda dan tambahkan ikatan berikut dengan nama mesin Anda.

         <binding protocol="http" bindingInformation=":50333:your-machine-name" />
    
  3. Mulai ulang IIS Express

vikomall
sumber
9
Lupakan. Visual Studio membuat entri konfigurasi duplikat untuk item. Saya menghapusnya dan berhasil.
nuzzolilo
3
IIS Express tidak selalu menggunakan file konfigurasi di jalur itu. Baca output dari iisexpress.exehati-hati untuk melihat file konfigurasi yang digunakan.
Kolonel Panic
5
Butir poin 3, restart IIS Express! Temukan ikon di baki sistem Anda dan hentikan untuk memaksanya restart. Tidak yakin apakah ada cara yang lebih elegan. Tetapi ini berhasil bagi saya. Terima kasih!
Senator
9
Jika Anda terlalu malas untuk menambahkan setiap kombinasi hostname / ipaddress, gunakan * alih-alih "nama mesin Anda"
StarQuake
4
Satu petunjuk lagi: Jika Anda mengklik kanan pada ikon systray IISExpress, Anda dapat memilih "Tampilkan semua aplikasi" yang akan membuka dialog yang menunjukkan semua aplikasi yang sedang Anda jalankan secara lokal. Klik kanan pada aplikasi yang diinginkan (jangan klik kiri atau itu akan membuka browser), maka Anda akan melihat "Path" dan "Config" di bawah ini. Klik kiri pada "Config" dan itu akan membuka file Applicationhost.config terkait di mana Anda perlu menambahkan / mengedit binding seperti yang dijelaskan di atas. Itu adalah cara mudah untuk menemukan konfigurasi saat ini.
Matt
31

Hanya ada 1 hal yang berhasil untuk saya.

menggunakan *:portnumber:*itu tidak baik. Ya, setelah melakukan itu dan memastikan Windows Firewall terbuka, saya dapat terhubung ke port, tetapi saya masih mendapatkan kesalahan "503".

Saya menguji beberapa hal secara lokal, dan menemukan bahwa hanya http: // localhost yang berfungsi. Menggunakan alamat IP asli (bukan 127.0.0.1, tetapi, misalnya, 192.168.1.50), masih mengembalikan 503 bahkan pada mesin lokal. Saya mencoba menggunakan nama host asli di binding, tetapi IIS Express menolak untuk memulai. Ini mungkin sebenarnya ada hubungannya dengan bagaimana nama host sedang diselesaikan. Saya tidak mengeksplorasi lebih jauh.

Akhirnya, saya akhirnya menggunakan konfigurasi ini:

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

Dengan cara itu, saya dapat terhubung dari mesin jarak jauh menggunakan http://192.168.1.50:53351.

Kadal
sumber
Saya menekan kesalahan yang tepat ini, tetapi tidak ingin hard-kode IP saat ini ke dalam konfigurasi, karena dapat berubah. Saya menemukan wildcard berfungsi pada IP dan bagian hostname, jadi saya berakhir dengan: <binding protocol="https" bindingInformation="*:44300:*" /> <binding protocol="http" bindingInformation="*:8888:*" /> edit: benar-benar mencoba memahami SO markdown, saya berhenti :).
Brian Barker
19

Setelah menghabiskan lebih dari 3 jam pada subjek penuh saya memutuskan untuk berbagi pengaturan saya dengan Anda. Konfigurasi saya adalah Visual Express 2012 untuk pembaruan Web 4 di windows 8. Ini adalah pertama saya kembali ke MS VS sejak studi (setidaknya 8 tahun) dan sekarang saya yakin bahwa aturan linux. Pada Django, pengaturan seperti ini membutuhkan waktu 10 menit untuk mencari dokumentasi.

  1. matikan firewall untuk pengujian

    netsh advfirewall set allprofiles state off
    
  2. setel binding dalam alamat lokal saya adalah localIP = 192.168.1.102 (karena tautan tidak dapat berisi domain nonnumerik, gunakan di bawah ini sebagai ganti mylocaldomain.com, lihat kebijakan stackoverflow) di Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    
  3. tambahkan autorun untuk layanan mulai ISS Express secara otomatis

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    
  4. Tambahkan beberapa aturan aneh ke server http (saya masih tidak tahu apakah ini perlu)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    
  5. jalankan IISExpress secara manual bukan dari VS IDE

  6. Anda akan melihat bahwa ISSExpress sedang mendaftarkan binding
  7. jalankan browser http://mylocaldomain.com:53351 jika berfungsi maka kita bisa menambahkan aturan firewall
  8. tambahkan aturan firewall

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

atur remoteip ke apa pun jika Anda ingin mengakses server Anda dari dunia luar jika Anda ingin mengakses untuk jaringan lokal gunakan subnet lokal

  1. mulai firewall

    netsh advfirewall set allprofiles state on
    
  2. periksa lagi apakah semuanya berfungsi pada ip lokal dan publik

Semoga beruntung

Rafal

Rafal
sumber
3
Ini menyebabkan IIS Express tidak lagi berjalan di Win8 dengan VS2013 tanpa menjalankan VS2013 sebagai Administrator. Itu disebabkan oleh IIS Express sekarang mencoba untuk membuka lalu lintas eksternal sebagai hasil dari perintah netsh. Saya juga tidak pernah benar-benar mendapatkannya untuk melayani lalu lintas itu; Saya akan mendapatkan 503. Untuk membalikkan masalah yang disebabkan oleh perintah netsh dalam jawaban ini, jalankan ini dari Command Prompt yang menjalankan sebagai Administrator: netsh http delete urlacl url=http://*:55416/(ganti port dengan port Anda)
Chris Moschini
fwiw - Saya tidak perlu langkah 4 (panggilan netsh yang @Rafal tidak yakin diperlukan) dan, meskipun saya tidak memerlukan ikatan "localhost" pada langkah 2 untuk menjalankan proyek VS2013 dalam solusi saya, bagian depan end memuat lebih cepat secara signifikan ketika pengikatan "localhost" dibiarkan di tempatnya.
lukkea
Saya menemukan bahwa mengikuti instruksi di atas masih menghasilkan 503 menggunakan localhost. Saya menemukan bahwa nama mesin guest (Windows) harus ada di binding applicationhost.config, dan pada host (Mac) nama mesin guest perlu dipetakan 127.0.0.1masuk /etc/hosts. Baru saat itulah permintaan ke mesin tamu pada tuan rumah berhasil.
Matt
Satu tambahan untuk langkah 5. Gunakan iisexpress.exe / siteid: id di mana id adalah nilai atribut id situs Anda di pengaturan <site id = "id">, jika tidak maka akan memulai situs pertama.
Mudit Jain
9

Menemukan masalah berkaitan dengan pemetaan urlacl yang buruk. Untuk mengetahuinya:

netsh http show urlacl 

dan cari hal-hal seperti http://+:80/atau port yang Anda ikat.

Lalu gunakan

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

Ini memperbaiki masalah bagi saya.

Anthony Rizzolo
sumber
4
seharusnya netsh http menghapus urlacl url = <url dari daftar>, ini bekerja untuk saya terima kasih!
sergiogx
1
Ini dibahas lebih rinci di blog msdn . Ini akhirnya masalah saya juga.
Kevin Scharnhorst
3
Terima kasih, sintaks yang tepat adalahnetsh http delete urlacl <yoururl>
yoel halb
7

Tidak ada yang berhasil untuk saya. Akhirnya saya menemukan iisexpress-proxy

Lihat jawaban saya https://stackoverflow.com/a/33623399/631527

Solusi lain adalah ngrok

Toolkit
sumber
Luar biasa! Saya mencoba semua solusi lain dan mereka juga tidak berhasil. "Permintaan salah" atau "Layanan tidak tersedia". Terlalu rumit. Saya memasang modul simpul dan menjalankannya, langsung berfungsi !!
TetraDev
BEKERJA! suci! Terima kasih!
Ayson Baxter
lihat juga ngrok
Toolkit
1
SEDERHANA bekerja seperti pesona dengan ngrok! Sungguh aneh harus merutekan dari localhost ke iis-proxy dan kemudian dari proxy ke ngrok, tapi hei, berhasil !. Sebagai contoh, saya memiliki iisexpress di port 3028. Saya berlari iisexpress-proxy 3028 to 12345lalu ./ngrok.exe http 12345. 😅
Reuel Ribeiro
@TetraDev, "Permintaan salah" atau "Layanan tidak tersedia" adalah karena tajuk host yang diterima ketika mengakses localhost dari ngrok bukan localhost seperti yang dijelaskan di sini
Dani Torres
3

Apa yang membantu saya, adalah mengklik kanan ikon 'IISExpress', 'Tampilkan Semua aplikasi'. Kemudian memilih situs web dan saya melihat aplicationhost.config yang digunakannya, dan koreksi berjalan dengan sempurna.

Konfigurasi IISExpress

Emmanuel
sumber
1

Masalahnya adalah memperbarui file applicationhost.config di dalam folder web alih-alih solusi. File konfigurasi solusi adalah yang harus diubah

Victor Arce
sumber
1

Setelah solusi @vikomall jangan lupa untuk memulai VS sebagai administrator. Ini perbaiki untuk saya.

Rapido
sumber
0

Mengenai jawaban Anthony Rizzolo: di Windows 8.1, saya harus mengetik seperti ini:

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

Sebagai contoh:

netsh http delete urlacl url=http://+:8689/
Elrinth
sumber
0

Tidak ada jawaban di atas yang berfungsi untuk saya.

Saya memiliki dua entri di netsh untuk layanan yang sama

netsh http show urlacl

masukkan deskripsi gambar di sini

Satu menggunakan wildcard yang kuat, yang lain menggunakan wildcard yang lemah.

Menghapus satu dengan wildcard yang lemah melakukan pekerjaan.

Lebih lanjut tentang wildcard yang kuat dan lemah dalam konteks netsh

Ketika elemen host dari UrlPrefix terdiri dari tanda plus tunggal (+), UrlPrefix cocok dengan semua nama host yang mungkin dalam konteks skema, port, dan elemen relatifURI, dan termasuk dalam kategori wildcard yang kuat.

Ketika tanda bintang (*) muncul sebagai elemen host, maka UrlPrefix masuk ke dalam kategori wildcard yang lemah. UrlPrefix jenis ini cocok dengan nama host apa pun yang terkait dengan skema, port, dan relatifURI yang ditentukan yang belum dicocokkan dengan UrlPrefix wildcard yang kuat, eksplisit, atau lemah-wildcard yang terikat IP. Spesifikasi host ini dapat digunakan sebagai catch-all default dalam beberapa keadaan, atau dapat digunakan untuk menentukan bagian besar dari namespace URL tanpa harus menggunakan banyak UrlPrefixes.

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

Matcheek
sumber