Asp.NET Web API - 405 - Kata kerja HTTP yang digunakan untuk mengakses halaman ini tidak diperbolehkan - cara mengatur pemetaan penangan

106

Saya menulis layanan REST menggunakan ASP.NET Web API. Saya mencoba mengirim permintaan HttpDelete, namun saya mendapatkan kesalahan berikut:

405 - Kata kerja HTTP yang digunakan untuk mengakses halaman ini tidak diperbolehkan

Saya pikir saya sudah dekat dengan solusinya, saya menemukan bahwa saya harus mengaktifkan manajemen jarak jauh IIS, buka bagian Pemetaan Penangan dan tambahkan kata kerja DELETE ke posisi yang sesuai ... tetapi masalahnya adalah ada banyak posisi berbeda di daftarnya ... (seperti di sini: http://www.somacon.com/p126.php ).

Yang mana yang harus saya edit? Beberapa dari mereka tidak memiliki ekstensi, misalnya "ExtensionUrlHandler-Integrated-4.0" dan saya menambahkan kata kerja DELETE padanya, tetapi masih tidak berfungsi ...

Itu hanya bidikan dalam kegelapan untuk memodifikasi yang satu itu, jadi haruskah saya mengubah posisi yang berbeda? Jika ya, yang mana? Atau mungkin ada hal lain yang harus saya lakukan?

Layanan web yang sama berfungsi dengan baik pada layanan lokal saya, jadi saya kira masalahnya ada pada IIS jarak jauh ...

Salam pembuka

Bart
sumber
3
Hei Bart. Bisakah Anda mengubah jawaban ke web.config? Ini benar-benar lebih baik daripada mencopotnya. dan Anda memiliki banyak pemirsa
Ashkan Sirous

Jawaban:

28

Penyebab umum kesalahan ini adalah WebDAV . Pastikan Anda menghapusnya.

Darin Dimitrov
sumber
Saya telah menonaktifkannya, tetapi tidak membantu
Bart
3
Menonaktifkan tidak membantu, Anda harus menghapus instalannya.
John_
Saya dapat mengonfirmasi bahwa menonaktifkan tidak membantu. @John_ benar, Anda harus menghapus penginstalan.
Mike L
7
jawaban giacomelli di bawah ini harus ditandai sebagai benar untuk pertanyaan ini; ini adalah solusi lokal yang tidak mengharuskan Anda untuk menghapus WebDav.
Joseph Woodward
1
@ B.ClayShannon WebDAV bukan program mandiri, ini adalah fitur IIS. Jadi, tergantung pada OS Anda, Anda harus menemukannya di bawah fitur windows / peran / layanan peran / ... apa pun yang mereka anggap bagus untuk mengklasifikasikannya. Tetapi jika perubahan di web.config tidak membuat perbedaan, itu berarti Anda tetap mengalami masalah lain.
Frédéric
359

Anda tidak perlu menghapus WebDAV, cukup tambahkan baris ini ke web.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
giacomelli
sumber
1
Ini bekerja dengan baik. Seseorang memang perlu menggunakan semuanya; sertakan kedua baris "hapus nama = ...".
Chris Patterson
51
Ini harus menjadi jawaban yang diterima imho, karena ini adalah solusi lokal, bukan global.
Marco Mp
3
ini baru saja muncul untuk saya sebelum demo besar besok pagi. Anda benar-benar menyelamatkan hidup saya.
Sonic Soul
27
"Anda benar-benar menyelamatkan hidup saya" - Tiba-tiba klien saya tampak tidak terlalu buruk.
Brandon Gano
3
Jawaban yang sangat bagus. Saya setuju bahwa ini harus menjadi jawaban yang diterima. Ini membuat saya merasa jauh lebih baik daripada mencopot pemasangan WebDAV sepenuhnya dari server web kami.
mituw16
17

Ubah file Web.Config Anda seperti di bawah ini

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Hithesh
sumber
Menambahkan hapus WebDAV dan WebDAVMODULE memungkinkan fungsi PUT dan DELETE. Terima kasih.
Gfw
Itu neraka ketika saya menambahkan kode di atas dalam file webconfig proyek api saya
Baqer Naqvi
15

Ubah file Web.Config Anda seperti di bawah ini. Ini akan bertindak seperti pesona.

Dalam node <system.webServer>tambahkan bagian kode di bawah ini

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

Setelah menambahkan, Web.Config Anda akan terlihat seperti di bawah ini

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>
Santosh Prasad Sah
sumber
Anda tidak boleh mengembalikan * untuk Allow-Origin. Lihat stackoverflow.com/a/12014554
Karlas
@Karlas, silahkan baca pertanyaan terlebih dahulu sebelum memberikan komentar dan down voting. Pertanyaan tidak ditanyakan untuk "Allow-Origin" melainkan diminta untuk handler untuk verba http.
Santosh Prasad Sah
3
Saya tidak memberi suara negatif, hanya komentar sampingan, jika seseorang menyalin dan menempelkan solusinya.
Karlas
Terima kasih! runAllManagedModulesForAllRequests = "true" adalah yang melakukannya untuk saya.
Eddie Fletcher
9

Saya memiliki masalah ini dan saya memecahkan yang berikut:

  1. buka IIS
  2. Pilih Situs Backend

    masukkan deskripsi gambar di sini

  3. dalam tampilan fitur: buka Pemetaan Penangan

masukkan deskripsi gambar di sini

  1. di jendela Pemetaan Penangan, Temukan WebDAV

masukkan deskripsi gambar di sini

  1. di Edit Module Mapping, buka Request Restrictions

masukkan deskripsi gambar di sini

  1. masukkan deskripsi gambar di sini
BehrouzMoslem
sumber
Menyelamatkan hidupku. Terima kasih
deanwilliammills
1
Ini tidak berhasil. Itu merusak seluruh situs .Net CORE. Harus kembali.
Ravi Ram
4

Jika tidak ada solusi di atas yang menyelesaikan masalah Anda seperti dalam kasus saya (masih terjebak dengan modul RestClient saya menghadapi 405) coba minta Api Anda dengan alat seperti Postman atau Fiddler. Maksud saya, masalahnya mungkin ada di tempat lain seperti permintaan berformat buruk.

Saya menemukan bahwa modul RestClient saya meminta 'Put' dengan paremeter Id yang tidak diformat dengan baik:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

dari pada

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

Kebetulan, permintaan berformat buruk kembali 405 - Metode Tidak Diizinkan (IIS 7.5)

Guillaume Raymond
sumber
Saya memiliki situasi yang sama di sini. Tapi, dalam kasus saya, saya harus menyerahkan tubuh dengan permintaan PUT saya. Saya menggunakan Insomnia (seperti Postman) sebagai klien alat dan berfungsi dengan sangat baik. Tapi tidak pada kode saya. Ada ide?
Darós
3

Jarang tetapi mungkin membantu beberapa.

pastikan Anda menggunakan [HttpPut] dari System.Web.Http

Kami mendapatkan 'Metode tidak diizinkan' 405, pada metode dekorasi HttpPut.

Masalah kami tampaknya tidak umum, karena kami secara tidak sengaja menggunakan atribut [HttpPut] dari System.Web.Mvc dan bukan System.Web.Http

Alasannya adalah, resharper menyarankan versi .Mvc, di mana-seperti biasanya System.Web.Http sudah direferensikan ketika Anda mendapatkan langsung dari ApiController kami menggunakan kelas yang memperpanjang ApiController.

Nick Josevski
sumber
1
Jika Anda menggunakan API Web, Anda tidak mendekorasi metode pengontrol sama sekali - tetapi gunakan kata kerja dalam nama metode.
niico
2

Saya telah mengalami ini (metode 405 tidak diizinkan) ketika metode posting api web yang saya panggil memiliki tipe primitif untuk parameter, alih-alih tipe kompleks yang diakses dari tubuh. Seperti:

Ini berhasil:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Ini tidak:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)
Tony
sumber
1
Ini juga bisa terjadi jika ada ketidakcocokan antara parameter di rute dan nama variabel di tanda tangan metode (Dengan kata lain, route = "/ api / person / {identity}" dan method = "public void putPerson (int id) {...} ")
RonnBlack
2

Kesalahan ini berasal dari pengendali file statis - yang secara default tidak memfilter kata kerja apa pun, tetapi mungkin hanya dapat menangani HEAD dan GET.

Dan ini karena tidak ada pawang lain yang naik ke pelat dan berkata bahwa mereka dapat menangani DELETE.

Karena Anda menggunakan WEBAPI, yang karena peruteannya tidak memiliki file dan karenanya ekstensi, tambahan berikut perlu ditambahkan ke file web.config Anda:

<system.webserver>
    <httpProtocol>
        <handlers>
          ...
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

            <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Jelas apa yang dibutuhkan bergantung pada classicmode vs integratedmode, dan classicmode bergantung pada bitness. Selain itu, header OPTIONS telah ditambahkan untuk pemrosesan CORS, tetapi jika Anda tidak melakukan CORS, Anda tidak memerlukannya.

FYI, web.config Anda adalah versi lokal untuk aplikasi (atau direktori aplikasi) yang level teratasnya adalah applicationHost.config.

Gerard ONeill
sumber
1

Jika IIS 8.0, periksa apakah Aktivasi HTTP diaktifkan. Manajer server -> IIS -> Kelola (lihat kanan atas) -> Tambahkan Peran dan Fitur -> ... -> masuk ke konfigurasi WCF dan kemudian pilih Aktivasi HTTP.

Narsi Venkat
sumber
0

Dalam kasus kami, masalahnya ada pada proses masuk gabungan antara situs .Net dan ADFS. Ketika mengarahkan ke ADFS endpoint yang wctxparameter yang diperlukan semua tiga parameter untuk WSFederationAuthenticationModule.CreateSignInRequestmetode: rm, id, danru

Terima kasih kepada Guillaume Raymond atas tip untuk memeriksa parameter URL!

dan rubah
sumber
0

Selain semua solusi di atas, periksa apakah Anda memiliki " id" atau parameter yang ditentukan khusus dalam DELETEmetode ini cocok dengan konfigurasi rute.

public void Delete(int id)
{
    //some code here
}

Jika Anda mengalami kesalahan 405 berulang kali, lebih baik setel ulang tanda tangan metode ke default seperti di atas dan coba.

Konfigurasi rute secara default akan dicari iddi URL. Jadi nama parameter idpenting di sini kecuali Anda mengubah konfigurasi rute di bawah App_Startfolder.

Anda dapat mengubah tipe data idmeskipun.

Misalnya metode di bawah ini seharusnya berfungsi dengan baik:

public void Delete(string id)
{
    //some code here
}

Catatan: Pastikan juga bahwa Anda meneruskan data melalui url, bukan metode data yang akan membawa muatan sebagai konten tubuh.

DELETE http://{url}/{action}/{id}

Contoh:

DELETE http://localhost/item/1

Semoga membantu.

Arun
sumber
0

Saya akan menambahkan bagi mereka yang terjebak mencoba menjalankan PHP( Laraveldalam kasus mungkin) atau IISsituasi hosting unik lainnya dengan 405 error, bahwa Anda perlu mengubah verbsdi handler untuk itu untuk situasi khusus itu ... jadi sejak saya menggunakan PHPsaya pergi ke yang PHPhandler dan dalam Request Restrictions, kemudian Verbstab, tambahkan verbsyang Anda butuhkan. Ini yang saya butuhkan untuk menambah web.configuntuk mengaktifkan CORSdi Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
Serj Sagan
sumber
0

Semua hal di atas tidak berhasil untuk saya dan saya mengalami masalah pemotretan menggunakan halaman dukungan ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-hosted-on-a-server) kemudian saya membandingkan file host aplikasi dengan salah satu copy pekerjaan dan sepertinya saya kehilangan banyak penangan dan ketika saya menambahkan kembali ke host aplikasi, itu mulai berfungsi. Saya merindukan semua ini,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
sukacita sharon
sumber