WebAPI Silme çalışmıyor - 405 Yönteme İzin Verilmiyor


120

Sitenin bu gece yayınlanması gerektiği için bu konudaki herhangi bir yardım için minnettarım!

Silme yöntemine sahip bir web api denetleyicim var. Yöntem, IIS Express (Windows 8) çalıştıran yerel makinemde iyi bir şekilde çalışıyor, ancak onu canlı IIS sunucusuna (Windows Server 2008 R2) dağıtır dağıtmaz çalışmayı durdurdu ve aşağıdaki hata mesajını veriyor:

HTTP Hatası 405.0 - Yönteme İzin Verilmiyor Aradığınız sayfa geçersiz bir yöntem (HTTP Fiili) kullanıldığından görüntülenemiyor

Çözümler için web'e baktım ve en makul olanları uyguladım. Web yapılandırmam aşağıdaki ayarlara sahiptir:

<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>

IIS'deki İşleyici Eşlemelerini ve İstek Filtrelemesini de boşuna değiştirmeyi denedim. Lütfen IIS'deki WebDAV Yazma Kurallarının devre dışı bırakılmış gibi göründüğünü unutmayın.

Herhangi bir fikir çok takdir edilecektir.

Yanıtlar:


199

Çözümü sonunda buldum! Aynı sorunla karşılaşırsanız, aşağıdakileri web.config dosyanıza ekleyin.

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

Umarım bu yardımcı olur



3
Burada da çalıştı. Ama birisi bana WebDAVModule ile olan ilişkisini açıklayabilir mi?
Boas Enkler

11
sadece kopyalayıp yapıştıranlar için: runAllManagedModulesForAllRequests = "true" gerçekten gerekli değildir ve aslında başka şeyleri bozabilir.
Zar Shardan

Diğer bazı web gönderileri IIS Modülleri bölümünü kullanarak modülün kaldırılmasını önerecektir, bu onu devre dışı bırakır ancak yine de buna / benzer bir soruna neden olur, bu en güvenilir yöntemdir
Anthony Main

4
@ZarShardan (ve diğerleri) Bilginize: runAllManagedModulesForAllRequests = "true" özniteliğini kaldırırsanız, <handlers> düğümünün altına da <remove name = "WebDAV" /> eklemeniz gerekir.
Aaron

65

Bazı durumlarda, onu sadece modüllerden kaldırmak bir sonraki hataya neden olabilir:

500.21 "WebDAV" işleyicisinin modül listesinde bozuk bir "WebDAVModule" modülü var

Modül: IIS Web Çekirdeği Bildirimi: ExecuteRequestHandler "

burada çözüm önerildi . Ayrıca işleyicilerden çıkarmanız gerekir.

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>

1
bu benim için çalışıyor, ancak biri WebDAV'ın gerçekte ne olduğuna biraz ışık tutabilir mi?
Nazrul Muhaimin

31

Benim durumumda yukarıdaki çözümlerden hiçbiri işe yaramadı. Bunun nedeni , parametremin adını değiştirmiş olmamdı .Delete yöntemle.

sahiptim

public void Delete(string Questionid)

onun yerine

public void Delete(string id)

idAdı kullanmam gerekiyor çünkü dosyamda belirtilen isim bu WebApiConfig. Not idüçüncü ve dördüncü hatları adı:

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

Bu çözümü buradan aldım .


15

HTTP DELETEfiili için Javascript şu şekilde olmalıdır:

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

Do not böyle bir şey kullanın:

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

POSTyöntemi kullandığınızda olduğu gibi .


1
Merhaba @Pavel, gerçekten tamamen RESTful bir uygulama kullanıyorsanız bu doğrudur. Ne yazık ki, bunu herkes yapmaz ve geliştiricilerin DELETE vb. Yerine POST kullandığını görmek oldukça yaygındır. Bunu açıklığa kavuşturduğunuz için teşekkürler.
Chris

5

Buradaki hemen hemen her çözümü denedikten sonra bu benim için çalıştı. Bunu API'ler yapılandırma dosyanıza ekleyin

<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>

Pek çok şey denedim, bu işe yaradı. .NET sürüm 4.6.1 - Teşekkürler.
Ketan

4

IIS 7.0 veya sonraki bir sürümünü kullanıyorsanız. Bu sorun esas olarak IIS sunucusundaki WebDAV genişletme modülüyle ilgilidir. bu, Post VEYA silme eylemi kullanılırken meydana geldi.

Lütfen web yapılandırmasında aşağıdaki ayarı deneyin

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>

3

Ben de aynı sorunu yaşadım, WebAPi'yi arıyorum ve bu hatayı alıyorum. Hizmetler için web.config dosyasına aşağıdaki yapılandırmayı eklemek sorunumu çözdü

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

web.config dosyasında sorunumu çözdüm. İstemci tarafından böyle arıyordum

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;
    }
}

2

ApplicationHost.config (genellikle C: \ Windows \ System32 \ inetsrv \ config altında) dosyasına gidin ve applicationHost.config dosyasında aşağıdaki satırı yorumlayın

1) <handlers> altında:

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

2) Yukarıdaki işleyici tarafından <modüller> altında belirtilen aşağıdaki modülü de yorumlayın

<add name="WebDAVModule" />

Veya makine genelindeki yapılandırma dosyasını değiştirmek istemiyorsanız (veya yapamıyorsanız), bu işleyicileri kendi web.config'ınızda KALDIRMAK için diğer yanıt stackoverflow.com/a/47907578/1754743'ü kullanın
Ekus

2

Benim durumumda, ben eklemek cevapsız {id}için [Route("")]ve aynı hata var. Bunu eklemek benim için sorunu çözdü:[Route("{id}")]


Saatlerce boşa harcanan zaman ve eğer senin için olmasaydı yine de çözemedim .... Neden 404: @
deadManN

1

WebApi denetleyicisinde Sil yöntemini herkese açık hale getirmeyi atladığım için 405 Yönteme İzin Verilmedi hatası aldım.

Bunu bulmam uzun zaman aldı (çok uzun!) Çünkü bu durumda bir Bulunamadı hatası bekliyordum, bu yüzden yanlışlıkla Silme yöntemimin reddedildiğini varsayıyordum.

Bulunamadı yerine İzin Verilmedi'nin nedeni, aynı rota için bir Get yöntemine de sahip olmamdır (bu, REST'i uygularken normal durum olacaktır). Genel Get işlevi, yönlendirme ile eşleşir ve ardından yanlış http yöntemi nedeniyle reddedilir.

Bildiğim basit bir hata ama başka birine biraz zaman kazandırabilir.


1

Sadece eklemek için. Bu sizin yapılandırmanızsa

config.Routes.MapHttpRoute (
            ad: "DefaultApi",
            routeTemplate: "api / {controller} / {id}",
            varsayılanlar: yeni {id = RouteParameter.Optional}

lütfen Hugo'nun dediği gibi yapmaya devam edin ve Route özniteliğini kontrolör alma yöntemine ayarlamayın, bu benim durumumda bir sorun yarattı.


0

Benzer bir sorun yaşadım ama PUT için - diğer önerilerin hiçbiri benim için işe yaramadı.

Ancak id intiçin varsayılan yerine kullanıyordum string. {id:int}rotaya eklemek sorunumu çözdü.

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

0

İsteğimizin API yanıtını karıştıran birden çok başlığı olduğundan web.config dosyamıza özel başlıklar eklememiz gerekiyordu.

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

-1

Delete yönteminin üstündeki [HttpPost] özelliği bu sorunu benim için çözdü:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

Bu sizin için çalışmasının bir nedeni olabilir. 2013'ün başlarında, daha önceki bir sürümdeydim, bu yüzden o zamandan beri pek çok şey düzeltildi. Yine de sizin için çalıştığını bilmek güzel.
Chris

4
Dürüst olmak gerekirse bu iyi bir cevap değil. Kimin sorunu bu kullanılarak çözüldü insanlar yerine DELETE POST kullanıyorsunuz elinden değil ve olmamalı çalışma öylesine
Alexander Derck

Bunun , istemci tarafında (yani isteğin url'si data) yerine params(yani isteğin gövdesini) kullanmanızdan kaynaklandığına inanıyorum .
Thomas Sauvajon

Alexander Derck'e katılıyorum, bu bir çözümden çok bir kludge.
Basem Sayej
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.