Asp.NET Web API - 405 - Bu sayfaya erişmek için kullanılan HTTP fiiline izin verilmez - işleyici eşlemeleri nasıl ayarlanır


106

ASP.NET Web API kullanarak REST servisi yazdım. HttpDelete isteği göndermeye çalışıyorum, ancak aşağıdaki hatayı alıyorum:

405 - Bu sayfaya erişmek için kullanılan HTTP fiiline izin verilmiyor

Çözüme yakın olduğumu düşünüyorum, IIS uzaktan yönetimini etkinleştirmem gerektiğini, İşleyici Eşlemeleri bölümüne gitmem ve uygun konuma DELETE fiili eklemem gerektiğini öğrendim ... ama sorun şu ki, üzerinde birçok farklı konum var liste ... (burada olduğu gibi: http://www.somacon.com/p126.php ).

Hangisini düzenlemeliyim? Çok azının uzantısı yok, örneğin "ExtensionUrlHandler-Integrated-4.0" ve ona DELETE fiili ekledim, ancak yine de çalışmıyor ...

Bunu değiştirmek karanlıkta yapılan bir atıştı, bu yüzden farklı konumu değiştirmeli miyim? Varsa hangisi? Ya da belki yapmam gereken başka bir şey var mı?

Aynı web hizmeti yerel hizmetimde mükemmel çalışıyor, bu yüzden sorunun uzak IIS ile ilgili olduğunu tahmin ediyorum ...

Selamlar


3
Hey Bart. Web.config'e verilen yanıtı değiştirebilir misiniz? Kaldırmaktan gerçekten daha iyidir. ve çok sayıda izleyiciniz var
Ashkan Sirous

Yanıtlar:


28

Bu hatanın yaygın nedeni WebDAV'dır . Kaldırdığınızdan emin olun.


Devre dışı bıraktım ama yardımcı olmadı
Bart

3
Devre dışı bırakmak yardımcı olmaz, yüklemesini kaldırmanız gerekir.
John_

Devre dışı bırakmanın yardımcı olmadığını teyit edebilirim. @John_ haklı, kaldırmanız gerekiyor.
Mike L

7
giacomelli'nin aşağıdaki cevabı bu soru için doğru olarak işaretlenmelidir; WebDav'ı kaldırmanızı gerektirmeyen yerel bir çözümdür.
Joseph Woodward

1
@ B.ClayShannon WebDAV, bağımsız bir program değildir, bir IIS özelliğidir. Bu nedenle, işletim sisteminize bağlı olarak, onu Windows özellikleri / roller / roller hizmetleri / ... altında bulmanız gerekir. Ancak web.config'deki değişiklik herhangi bir değişiklik yaratmadıysa, yine de başka bir sorunla karşılaştığınız anlamına gelir.
Frédéric

359

WebDAV'ı kaldırmanız gerekmez, şu satırları web.config dosyasına eklemeniz yeterlidir:

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

1
Bu iyi çalıştı. Bunların hepsini kullanmak gerekiyor; her iki "remove name = ..." satırını da içerir.
Chris Patterson

51
Bu, küresel değil yerel bir çözüm olduğu için kabul edilen cevap imho olmalıdır.
Marco Mp

3
bu benim için yarın sabah büyük bir demodan önce geldi. tam anlamıyla hayatımı kurtardın.
Sonic Soul

27
"Kelimenin tam anlamıyla hayatımı kurtardın" - Aniden müşterilerim o kadar kötü görünmüyor.
Brandon Gano

3
Mükemmel cevap. Bunun kabul edilen cevap olması gerektiğine katılıyorum. Bu, WebDAV'ı web sunucumuzdan tamamen kaldırmaktan çok daha iyi hissettirdi.
mituw16

18

Web.Config dosyanızı aşağıdaki gibi değiştirin

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

1
Kaldır WebDAV ve WebDAVMODULE eklenmesi, PUT ve DELETE işlevlerine izin verdi. Teşekkürler.
Gfw

API projesi webconfig dosyama yukarıdaki kodu eklediğimde cehenneme döndü
Naqvi

15

Web.Config dosyanızı aşağıdaki gibi değiştirin. Cazibe gibi davranacak.

Düğümde <system.webServer>kodun aşağıdaki kısmını ekleyin

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

Ekledikten sonra, Web.Config'iniz aşağıdaki gibi görünecektir

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

Allow-Origin için * dönmemelisiniz. Bkz. Stackoverflow.com/a/12014554
Karlas

@Karlas, lütfen yorumunuzu yapmadan ve aşağı oy vermeden önce soruyu okuyun. "Allow-Origin" için soru sorulmadı, http fiilleri için işleyici soruldu.
Santosh Prasad Sah

3
Birinin çözümü kopyalaması durumunda olumsuz oy vermedim, sadece bir yan yorum.
Karlas

Teşekkürler! runAllManagedModulesForAllRequests = "true" benim için ne yaptı.
Eddie Fletcher

8

Bu sorunu yaşadım ve aşağıdakileri çözdüm:

  1. IIS'yi aç
  2. Arka Uç Sitesini Seçin

    görüntü açıklamasını buraya girin

  3. özellikler görünümünde: İşleyici Eşleme'yi açın

görüntü açıklamasını buraya girin

  1. İşleyici Eşleme penceresinde, WebDAV Bul

görüntü açıklamasını buraya girin

  1. Modül Eşlemesini Düzenle'de, İstek Kısıtlamalarını açın

görüntü açıklamasını buraya girin

  1. görüntü açıklamasını buraya girin

Hayatımı kurtardı. Teşekkürler
deanwilliammills

2
Bu işe yaramadı. Tüm .Net CORE sitesini kırdı. Geri dönmek zorunda kaldı.
Ravi Ram

4

Yukarıdaki çözümlerden hiçbiri sorununuzu benim durumumdaki gibi çözmediyse (yine de RestClient modülüm 405'e bakan) Api'nizi Postman veya Fiddler gibi bir araçla talep etmeye çalışın. Demek istediğim, sorun kötü biçimlendirilmiş bir istek gibi başka bir yerde olabilir.

RestClient modülümün, iyi biçimlendirilmemiş bir Id parametresine sahip bir 'Put' istediğini keşfettim:

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

onun yerine

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

Şaşırtıcı bir şekilde, kötü biçimlendirilmiş istek 405 - Yönteme İzin Verilmiyor (IIS 7.5) döndürüyor


Burada da aynı durum var. Ama benim durumumda, PUT isteğimle bir ceset göndermem gerekiyor. Insomnia'yı (Postacı gibi) bir araç istemcisi olarak kullanıyorum ve çok iyi çalışıyor. Ama benim kodumda değil. Herhangi bir fikir?
Darós

3

Yaygın değil, ancak bazılarına yardımcı olabilir.

Kullandığınız sağlamak [HttpPut] den System.Web.Http

HttpPut ile dekore edilmiş bir yöntemde 'Yönteme izin verilmiyor' 405 alıyorduk.

Yanlışlıkla System.Web.Mvc'den [HttpPut] özniteliğini System.Web.Http yerine kullandığımız için sorunumuz yaygın görünmüyor.

Bunun nedeni, resharper'ın .Mvc sürümünü önermesidir; burada - genellikle System.Web.Http, doğrudan ApiController'dan türettiğinizde, ApiController'ı genişleten bir sınıf kullanıyorduk.


1
Web API kullanıyorsanız, denetleyici yöntemlerini hiç dekore etmezsiniz, ancak yöntem adında fiili kullanırsınız.
niico

2

Bunu, aradığım web api post yöntemi, vücuttan erişilen karmaşık bir tür yerine parametreler için ilkel türlere sahip olduğunda yaşadım (405 yöntemine izin verilmiyor). Şöyle:

Bu işe yaradı:

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

Bu:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
Bu, rotadaki parametre ile yöntem imzasındaki değişken adı arasında bir uyuşmazlık varsa da meydana gelebilir (Diğer bir deyişle, rota = "/ api / kişi / {kimlik}" ve yöntem = "public void putPerson (int id) {...} ")
RonnBlack

2

Bu hata statik dosya işleyicisinden gelmektedir - varsayılan olarak hiçbir fiili filtrelemez, ancak muhtemelen yalnızca HEAD ve GET ile ilgilenebilir.

Ve bunun nedeni, başka hiçbir işleyicinin plakaya çıkıp SİLME işlemini yapabileceklerini söylemesidir.

Yönlendirme nedeniyle dosyalara ve dolayısıyla uzantılara sahip olmayan WEBAPI'yi kullandığınız için, web.config dosyanıza aşağıdaki eklemelerin eklenmesi gerekir:

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

Açıktır ki neye ihtiyaç duyulduğu , klasik mod ile entegre mod arasında, klasik mod ise bitliğe bağlıdır. Ek olarak, OPTIONS başlığı CORS işleme için eklenmiştir, ancak CORS yapmazsanız buna ihtiyacınız yoktur.

Bilginize, web.config'iniz, en üst düzeyi applicationHost.config olan uygulama (veya uygulama dizini) sürümünün yerelidir.


1

IIS 8.0 ise, HTTP Aktivasyonunun etkin olup olmadığını kontrol edin. Sunucu yöneticisi -> IIS -> Yönet (sağ üste bakın) -> Rolleri ve Özellikleri Ekle -> ... -> WCF yapılandırmasına gidin ve ardından HTTP Etkinleştirmeyi seçin.


0

Bizim durumumuzda, sorun bir .Net sitesi ile ADFS arasındaki birleşik oturum açma ile ilgiliydi. ADFS'de yönlendirme yaparken son noktasını wctxparametre için her üç parametre gerekli WSFederationAuthenticationModule.CreateSignInRequestyöntemde: rm, id, veru

Guillaume Raymond'a URL parametrelerini kontrol etme ipucu için teşekkürler!


0

Yukarıdaki tüm çözümlerin yanı sıra id, DELETEyöntemdeki " " veya özel tanımlı parametrenizin rota yapılandırmasıyla eşleşip eşleşmediğini kontrol edin.

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

Tekrarlanan 405 hataları ile karşılaşırsanız, yöntem imzasını yukarıdaki gibi varsayılana sıfırlayın ve deneyin.

Rota yapılandırması varsayılan idolarak URL'de arayacaktır . Bu nedenle, klasörün idaltındaki yol yapılandırmasını değiştirmediğiniz sürece parametre adı burada önemlidir App_Start.

idYine de veri türünü değiştirebilirsiniz .

Örneğin, aşağıdaki yöntem gayet iyi çalışmalıdır:

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

Not: Ayrıca, verileri gövde içeriği olarak taşıyacak veri yöntemi değil , url üzerinden ilettiğinizden emin olun .

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

Misal:

DELETE http://localhost/item/1

Umarım yardımcı olur.


0

Çalıştırmaya çalışırken takılıp kalanlara PHP( Laravelmuhtemelen) veya diğer benzersiz IISbarındırma durumlarına 405 error, verbsbu özel durum için işleyiciyi değiştirmeniz gerektiğini ekleyeceğim ... bu yüzden kullandığım için PHPgittim PHPişleyici ve Request Restrictionsardından Verbssekme eklemek verbsihtiyacınız. Bu eklemek için gerekli tüm ben web.configetkinleştirmek için CORSde 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>

0

Yukarıdakilerin hiçbiri benim için işe yaramadı ve bir destek sayfası kullanarak sorun çekiyordum ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-hosted-on-a-server) sonra uygulama ana bilgisayar dosyasını çalışan kopyalardan biriyle karşılaştırdım ve bir grup işleyicinin eksik olduğunu ve bunları uygulama ana bilgisayarına geri eklediğimde çalışmaya başladığını gördüm. Bütün bunları özlüyordum

<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" />
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.