"Metode 405 tidak diperbolehkan" di IIS7.5 untuk metode "PUT"

113

Saya menggunakan WebClienttype untuk mengupload file * .cab ke server saya. Di sisi server, saya mendaftarkan penangan HTTP untuk file * .cab dengan metode PUT seperti di bawah ini:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

Tapi saya selalu mendapatkan kesalahan "405 metode tidak diizinkan". Tanggapan mengatakan metode yang diizinkan adalah sebagai berikut:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

Bahkan jika saya secara eksplisit mengizinkan metode PUT di IIS Request Filtering untuk aplikasi web saya, kesalahan yang sama masih terjadi.

Saya menduga ini adalah masalah terkait IIS. Saya berharap seseorang bisa menjelaskan hal ini untuk saya.

smwikipedia
sumber

Jawaban:

214

Seringkali kesalahan ini disebabkan oleh modul WebDAV yang mencoba menangani permintaan semacam ini. Solusi yang mudah adalah dengan menghapusnya dari modul dan dari penangan system.webServerbagian tepat di dalam file web.config Anda. Berikut contoh konfigurasinya:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Davide Icardi
sumber
2
Menggunakan artikel MS berikut, saya menambahkan tag hapus ke penangan, tetapi masih tidak berhasil. Terima kasih atas jawaban Anda, saya mengerti, saya juga perlu menambahkannya ke bagian modul. Sangat dihargai. Ini artikelnya: asp.net/web-api/overview/testing-and-debugging/…
Tod Birdsall
Bagus, Anda menyelamatkan saya dari debugging yang menyakitkan selama berjam-jam! :)
Kaspars Ozols
Perbaikan sederhana dan mudah, Terima kasih!
MorenajeRD
Saya sudah mencobanya tetapi tidak berhasil untuk saya. Saya masih mendapatkan kesalahan 405 - Metode tidak diizinkan. Perhatikan bahwa saya menggunakan IIS Express dan kesalahan entah bagaimana hanya terjadi pada PUT tetapi berfungsi untuk GET, POST AND DELETE.
Thierry
47

Saya mengaktifkan Pelacakan Permintaan yang Gagal, dan mendapatkan info berikut:

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

Jadi, saya menghapus WebDAVModule dari IIS saya, semuanya baik-baik saja sekarang ~

Fitur pelacakan IIS sangat membantu.

smwikipedia
sumber
1
Terima kasih atas jawaban anda ! Setelah 2 hari penelitian, satu-satunya solusi yang saya temukan untuk menghindari "Metode 405 Tidak Diizinkan" adalah dengan menentukan header CORS dalam Application_BeginRequestmetode, seperti yang disebutkan dalam jawaban ini stackoverflow.com/a/14631068/827168 . Tetapi jawaban Anda lebih baik daripada yang lain karena membantu menemukan masalah daripada menerapkan beberapa tambalan acak :)
pomeh
@pomeh Saya selalu percaya dalam membuat logika lengkap. :)
smwikipedia
1
Catatan, Anda juga harus masuk ke Pemetaan Penangan dan menghapus WebDAV dari sana, atau Anda akan mendapatkan pesan kesalahan Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb
26

Saya mengalami masalah ini dengan WebDAV saat menghosting Proyek WebApi MVC4. Saya menyiasatinya dengan menambahkan baris ini ke web.config:

<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule"
      resourceType="Unspecified" requireAccess="None" />
</handlers>

Seperti dijelaskan di sini: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html

Nick
sumber
Solusi terbaik untuk seseorang yang benar-benar membutuhkan WebDAV. Apakah ada yang membutuhkan WebDAV adalah diskusi terpisah.
MrBoJangles
24

Diambil dari sini dan itu berhasil untuk saya:

1. Buka Manajer IIS.

2. Klik aplikasi Anda.

3. Buka "Pemetaan Penangan".

4. Dalam daftar fitur, klik dua kali pada "WebDAV".

5.Klik "Minta Pembatasan".

6. Di tab "Kata kerja" pilih "Semua kata kerja".

7. Tekan OK.

goran85
sumber
3
Ini membantu saya, tetapi saya akan menjelaskan dengan pengalaman saya. 2. Aplikasi (Layanan Web). 3. klik dua kali ikon Pemetaan Penangan di panel tengah.
Gary
19

Saya mencoba sebagian besar jawaban dan sayangnya, tidak ada yang berhasil menyelesaikannya.

Inilah yang berhasil untuk saya. Ada 3 hal yang harus dilakukan ke situs yang Anda inginkan untuk PUT (pilih situs):

  1. Buka WebDav Authoring Rulesdan kemudian pilih Disable WebDAVopsi yang ada di bilah kanan.

  2. Pilih Modules, temukan WebDAV Moduledan hapus.

  3. Pilih HandlerMapping, temukan WebDAVHandlerdan hapus.

Mulai ulang IIS.

coding_idiot
sumber
Ini bekerja! Tidak tahu apakah semua 3 langkah dapat dilakukan dengan mengedit file web.config, tetapi ini membuatnya mudah hanya dengan menggunakan IIS Management Console. Perhatikan saja bahwa ada 3 entri HandlerMapping yang dimulai dengan WebDAV * - Saya menghapus ketiganya dan hidup baik-baik saja.
SlimsGhost
1
Saya mencoba mencopot pemasangan WebDav dan tidak berhasil. Kemudian saya mengikuti ketiga langkah di atas dan PUTmulai bekerja.
rareyesdev
1
Langkah 2 dan 3 dapat diterapkan ke direktori virtual tanpa memengaruhi bagian lain situs.
Tonatio
1
Terima kasih banyak. kamu menyelamatkanku. Setelah 7 jam frustrasi, saya mencoba semua jawaban yang saya bisa dan akhirnya jawaban Anda menyentuh saya. :)
Zeeshan Safdar
1
Terima kasih, ini dia.
Ahmad Hamdy
17

Menghapus modul WebDAV seharusnya sudah cukup. Ubah saja Web.config Anda:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
Dunken
sumber
14

Lebih baik hanya menghapus fitur WebDAV yang tidak digunakan. Pergi ke Program dan Fitur => Nyalakan atau Matikan Fitur Windows dan nonaktifkan Penerbitan WebDAV di bawah

Layanan Informasi Internet => Layanan Web Dunia => Fitur HTTP Umum

masukkan deskripsi gambar di sini

SliverNinja - MSFT
sumber
Terima kasih! Ini benar-benar memperbaiki masalah saya!
wmehanna
4

Untuk alasan apa pun, menandai WebDAVModule sebagai "hapus" di web.config saya tidak cukup untuk memperbaiki masalah dalam kasus saya.

Saya telah menemukan pendekatan lain yang tidak memecahkan masalah. Jika Anda berada di perahu yang sama, coba ini:

  1. Di Manajer IIS, pilih aplikasi yang perlu mendukung PUT.
  2. Di Tampilan Fitur, temukan Aturan Penulisan WebDAV . Klik dua kali, atau pilih Open Feature dari menu konteks (klik kanan).
  3. Di panel Actions, menemukan dan klik pada WebDAV Pengaturan ... .
  4. Di Pengaturan WebDAV, temukan Permintaan Pemfilteran Perilaku , dan di bawah itu, temukan Izinkan Penyaringan Kata Kerja . Setel Izinkan Penyaringan Kata Kerja ke Salah .
  5. Di panel Tindakan, klik Terapkan .

Ini mencegah WebDAV menolak kata kerja yang tidak didukung, sehingga memungkinkan PUT mengalir ke penangan RESTful Anda tanpa gangguan.

Dan K
sumber
4

Tip lain dari saya. Saya telah menggunakan PHP + IIS, dan Handler Mappings untuk PHP tidak memiliki kata kerja PUT.

Buka IIS Manager-> Situs Anda-> Handler Mappings-> PHPxx_via_FastCGI-> Request Restrictions-> Verbs, lalu tambahkan PUT.

Itu dia!

Stefan Pintilie
sumber
1
Ini adalah jawaban yang dibutuhkan pengguna php.
SpeedOfRound
4

Modul penting lainnya yang perlu dikonfigurasi ulang sebelum PUT dan DELETE berfungsi adalah kata kerja opsi

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

Lihat juga posting ini: https://stackoverflow.com/a/22018750/9376681

Michael Radhuber
sumber
3

Saya memiliki masalah yang sama dengan PUT, PATCH dan DELETE tetapi tidak memiliki apa pun yang menginstal WebDav. Resolusi 1 dalam artikel ini akhirnya membantu saya: http://support.microsoft.com/kb/942051

gust1n
sumber
3

Saya menggunakan Angular 8 dan .NET core API. Saya menambahkan yang berikut ini di file layanan web.config saya. Itu mengatasi kesalahan saya.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>
atik sarker
sumber
2

Bagi saya kesalahan ini tidak akan hilang dan mengizinkan metode PUT, apa pun yang saya lakukan .. menghapus instalan webdav, meletakkan konfigurasi di web.config untuk menghapus webdav dari penangan dan modul, dan mengatur PUT sebagai kata kerja yang diizinkan pada filter permintaan di iis .. dan pastikan pemetaan penangan iis yang menangani permintaan telah dikonfigurasi PUT ..

Masalah saya akhirnya karena pemasangan ASP.NET 4.5 Extensions yang buruk. Menghapus semua yang terkait dengan asp.net dari peran dan fitur server. dimulai ulang. membaca peran dan memulai kembali. semuanya bekerja dengan konfigurasi di atas.

--- Di bawah ini akan membuat PUT diterima, tetapi akan mengirimkannya ke penangan yang salah. - abaikan di bawah ini

akhirnya, menambahkan kata kerja PUT sebagai kata kerja yang diizinkan pada pemetaan penangan TRACE di iis berhasil .. karena saya telah mengaktifkan pelacakan kesalahan yang gagal, dan kata kerja ini tidak mengizinkan kata kerja.

terakhir kali saya memiliki masalah yang sama di IIS server lain, itu karena '/' yang hilang di akhir URL karena menggunakan penangan default tanpa menggunakan dokumen default mungkin dan sekarang saya menyadarinya .. jadi periksa IIS pemetaan handler jika tidak ada yang membantu.

Harish
sumber
2

Saya mengalami masalah ini tetapi tidak ada yang terkait dengan WebDAV yang menjadi masalah. Dalam kasus saya, klien mengirim POST ke www.myServer.com/api/chart. Panggilan ini harus ditangani oleh "ExtensionlessUrlHanlder-Integrated-4.0", namun, entah bagaimana struktur file lokal telah dibuat di direktori server saya "... \ Server \ api \ chart \". Ini berarti bahwa handler "StaticFile" yang dipanggil. Menghapus file lokal tersebut akhirnya menyelesaikan masalah.

Atilio Jobson
sumber
2

Inilah yang berhasil untuk saya:

Buka IIS dan klik Situs Anda.

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.

nPcomp
sumber
1

Untuk Windows server 2012 -> Buka Manajer server -> Hapus Peran dan Fitur -> Peran Server -> Server Web (IIS) -> Server Web -> Fitur HTTP Umum -> Hapus centang Penerbitan WebDAV dan hapus -> Mulai ulang server.

Savan Gadhiya
sumber
0

Jika pool aplikasi IIS berjalan dalam mode klasik, pastikan Anda memiliki yang berikut ini di web.config Anda

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
Arjun Mukherji
sumber
0

Dalam kasus saya, saya telah memindahkan Web Deploy ke port lain, yang juga merupakan port IIS (bukan 80). Saya tidak menyadarinya pada awalnya, tetapi meskipun tidak ada kesalahan yang berjalan di bawah port yang sama, tampaknya Penyebaran Web paling mungkin merespons terlebih dahulu daripada IIS karena beberapa alasan, menyebabkan kesalahan ini. Saya baru saja memindahkan pengikatan IIS saya ke port lain dan semuanya baik-baik saja. ;)

James Wilkins
sumber
0

Untuk mencegah WebDav diaktifkan sama sekali, hapus entri berikut dari ApplicationHost.config: <add name="WebDAVModule" />

Entri tersebut terletak di bagian modul.

Lokasi yang tepat dari konfigurasi: C:\Windows\System32\inetsrv\config\applicationHost.config

Yush0
sumber
0

Saya memiliki masalah yang sama, dengan RESTful API yang berjalan pada inti aspnet.

Saya tidak ingin menghapus instalan WebDAV, dan saya mencoba sebagian besar solusi yang dijelaskan di atas. Saya mencoba mengatur kata kerja = "*" baik di situs maupun di server itu sendiri, tetapi tidak berhasil.

Apa triknya bagi saya adalah sebagai berikut:

Manajer IIS -> Situs -> MySite -> HandlerMappings -> aspNetCore -> Edit

-> Permintaan Pembatasan -> Akses -> Tidak Ada (itu adalah Script).

Setelah itu semuanya berfungsi, bahkan jika saya mengganti opsi WebDAV asli.

Dardan Vokshi
sumber