Hapus WebAPI tidak berfungsi - 405 Metode Tidak Diizinkan

120

Saya menghargai bantuan apa pun dalam hal ini karena situs ini seharusnya ditayangkan malam ini!

Saya memiliki pengontrol api web dengan metode Hapus. Metode ini dijalankan dengan baik di mesin lokal saya yang menjalankan IIS Express (Windows 8) tetapi segera setelah saya menyebarkannya ke server IIS langsung (Windows Server 2008 R2) itu berhenti bekerja dan menampilkan pesan kesalahan berikut:

Kesalahan HTTP 405.0 - Metode Tidak Diizinkan Halaman yang Anda cari tidak dapat ditampilkan karena metode yang tidak valid (Kata Kerja HTTP) sedang digunakan

Saya telah melihat-lihat web untuk mencari solusi dan saya menerapkan yang paling masuk akal. Konfigurasi web saya memiliki pengaturan berikut:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<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>

Saya juga mencoba mengubah Pemetaan Penangan dan Meminta Pemfilteran di IIS tidak berhasil. Harap dicatat bahwa Aturan Penulisan WebDAV di IIS tampaknya dinonaktifkan.

Setiap ide akan sangat dihargai Terima kasih.

Chris
sumber

Jawaban:

199

Saya akhirnya menemukan solusinya! Jika Anda menemukan masalah yang sama, tambahkan berikut ini ke web.config Anda

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

saya harap ini membantu

Chris
sumber
2
Saya juga harus menambahkan penghapusan di bagian penangan sesuai stackoverflow.com/a/6698096/254156
rrrr
3
Juga bekerja di sini. Tetapi dapatkah seseorang menjelaskan kepada saya hubungannya dengan WebDAVModule?
Boas Enkler
11
bagi mereka yang baru saja menyalin-tempel: runAllManagedModulesForAllRequests = "true" tidak benar-benar diperlukan dan benar-benar dapat merusak hal-hal lain.
Zar Shardan
Beberapa posting web lain akan menyarankan untuk menghapus modul menggunakan bagian Modul IIS, ini menonaktifkannya tetapi masih menyebabkan masalah ini / serupa, ini adalah metode yang paling dapat diandalkan
Anthony Main
4
@ZarShardan (dan lainnya) FYI: Jika Anda menghapus atribut runAllManagedModulesForAllRequests = "true", Anda juga perlu menambahkan <remove name = "WebDAV" /> di bawah node <handlers> juga.
Aaron
65

Dalam beberapa kasus, menghapusnya hanya dari modul dapat menghasilkan kesalahan berikutnya:

500.21 Handler "WebDAV" memiliki modul "WebDAVModule" yang buruk dalam daftar modulnya

Modul: Pemberitahuan Inti Web IIS: ExecuteRequestHandler "

solusi disarankan di sini . Juga perlu menghapusnya dari penangan.

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
aleha
sumber
1
ini berfungsi untuk saya, tetapi dapatkah seseorang menjelaskan apa itu WebDAV sebenarnya?
Nazrul Muhaimin
31

Dalam kasus saya, tidak ada solusi di atas yang berfungsi. Ini karena saya telah mengubah nama parameter dalam Deletemetode saya .

Saya punya

public void Delete(string Questionid)

dari pada

public void Delete(string id)

Saya perlu menggunakan idnama karena itulah nama yang dideklarasikan di WebApiConfigfile saya . Catat idnama di baris ketiga dan keempat:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Saya mendapat solusi ini dari sini .

Hugo Nava Kopp
sumber
15

Javascript untuk DELETEkata kerja HTTP harus seperti ini:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Jangan tidak menggunakan sesuatu seperti ini:

...
data: {id:id}
...

seperti saat Anda menggunakan POSTmetode ini.

Pavel Kharibin
sumber
1
Hai @Pavel, ini benar jika Anda memang menggunakan implementasi RESTful sepenuhnya. Sayangnya, tidak semua orang melakukan ini dan sangat umum melihat developer menggunakan POST, bukan DELETE, dll. Terima kasih telah mengklarifikasi hal ini.
Chris
5

Setelah mencoba hampir semua solusi di sini, ini berhasil untuk saya. Tambahkan ini di file konfigurasi API Anda

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>
Nithin Chandran
sumber
Mencoba banyak hal, ini berhasil. .NET versi 4.6.1 - Terima kasih.
Ketan
4

Jika Anda menggunakan IIS 7.0 atau versi yang lebih baru. Masalah ini terutama terkait dengan modul ekstensi WebDAV di server IIS. ini terjadi saat Menggunakan tindakan Kirim ATAU hapus.

Silakan coba di bawah pengaturan di konfigurasi web

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>
Abhishek B.
sumber
3

Saya juga mengalami masalah yang sama, saya menelepon WebAPi dan mendapatkan kesalahan ini. Menambahkan konfigurasi berikut di web.config untuk layanan memecahkan masalah saya

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

di file web.config memecahkan masalah saya. Ini adalah Bagaimana saya menelepon dari sisi klien

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}
Aamir
sumber
2

Buka file applicationHost.config (biasanya di bawah C: \ Windows \ System32 \ inetsrv \ config) dan komentari baris berikut di applicationHost.config

1) Di bawah <handlers>:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) Juga beri komentar tentang modul berikut yang dirujuk oleh penangan di atas di bawah <modules>

<add name="WebDAVModule" />
arviman
sumber
Atau gunakan jawaban lain stackoverflow.com/a/47907578/1754743 untuk MENGHAPUS penangan ini di web.config Anda sendiri, jika Anda tidak ingin (atau tidak dapat) memodifikasi file konfigurasi seluruh mesin
Ekus
2

Dalam kasus saya, saya merindukan untuk menambahkan {id}ke [Route("")]dan aku punya kesalahan yang sama. Menambahkan itu memperbaiki masalah saya:[Route("{id}")]

Reza
sumber
Berjam-jam waktu yang terbuang, dan jika bukan karena Anda, saya masih tidak bisa menyelesaikan ini .... Saya bertanya-tanya mengapa tidak kembali 404: @
deadManN
1

Saya mengalami kesalahan 405 Metode Tidak Diizinkan karena saya telah menghilangkan untuk membuat metode Hapus pada pengontrol WebApi publik.

Butuh waktu lama bagi saya untuk menemukan ini (terlalu lama!) Karena saya akan mengharapkan kesalahan Tidak Ditemukan dalam kasus ini, jadi saya salah berasumsi bahwa metode Hapus saya ditolak.

Alasan Tidak Diizinkan daripada Tidak Ditemukan adalah karena saya juga memiliki metode Dapatkan untuk rute yang sama (yang akan menjadi kasus normal saat menerapkan REST). Fungsi Get publik dicocokkan dengan perutean dan kemudian ditolak karena metode http yang salah.

Kesalahan sederhana yang saya tahu tetapi ini dapat menghemat waktu orang lain.

Paul D
sumber
1

Hanya untuk menambahkan. Jika ini adalah konfigurasi Anda

config.Routes.MapHttpRoute (
            nama: "DefaultApi",
            routeTemplate: "api / {controller} / {id}",
            default: baru {id = RouteParameter.Optional}

tolong terus lakukan seperti yang dikatakan Hugo, dan jangan setel atribut Route ke metode get controller, ini memberi masalah dalam kasus saya.

pengguna6247020
sumber
0

Saya memiliki masalah serupa tetapi untuk PUT - tidak ada saran lain yang berhasil untuk saya.

Namun saya menggunakan intdaripada default stringuntuk id. menambah {id:int}rute memecahkan masalah saya.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }
Hath
sumber
0

Kami harus menambahkan tajuk khusus ke web.config kami karena permintaan kami memiliki banyak tajuk yang membingungkan respons API.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>
Zadok
sumber
-1

Atribut [HttpPost] di atas metode Hapus memecahkan masalah ini untuk saya:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
Andriy Gubal
sumber
Itu bisa menjadi alasan mengapa ini berhasil untuk Anda. Saya menggunakan versi sebelumnya, sekitar awal 2013, jadi beberapa hal telah diperbaiki sejak saat itu. Senang mengetahui ini bekerja untuk Anda.
Chris
4
Sejujurnya, ini bukanlah jawaban yang bagus. Orang-orang yang masalahnya teratasi menggunakan ini menggunakan POST daripada DELETE sehingga tidak bisa dan tidak boleh berfungsi
Alexander Derck
Saya yakin ini karena Anda menggunakan data(yaitu isi permintaan) daripada params(yaitu url permintaan) di sisi klien.
Thomas Sauvajon
Saya setuju dengan Alexander Derck, ini adalah kludge daripada solusi.
Basem Sayej