ASP.NET Web API - Fiillere İzin Verme PUT & DELETE - IIS 8


145

Kısa süre önce Visual Studio 2010'dan Visual Studio 2012 RC'ye geçtim. Yükleyici, Visual Studio'nun artık varsayılan web sunucusu olarak kullandığı IIS 8 Express'i de yükler.

IIS 8, PUT AND DELETE fiillerini kullanan WEB API isteklerimi engelliyor. IIS bir 405 hatası döndürüyor The requested resource does not support http method 'PUT'.

İnsanların geçmişte bununla ilgili sorunları olduğunu biliyorum ve Stack Overflow'da bu konuda birkaç mesaj var. IIS 7 Express ile çözüm WebDav'ı kaldırmaktı. Ne yazık ki IIS 8 ile bunu yapmanın bir yolunu göremiyorum.

Applicationhost.config WebDav bölümlerini düzenlemeyi denedim ama bu yardımcı olmadı. Örneğin <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />, yapılandırma dosyasından kaldırdım .

Bunun için çok uzun zaman harcadım. PUT ve DELETE'i etkinleştirmenin basit bir yolu olmalı mı?


Bu hala RTM sürümünde kırık. Bu konuda sadece 3 saat harcadım ... Tek gereken ekstra fiilleri eklemekti ExtensionlessUrl-Integrated-4.0.
leppie

1
Bunun bozuk olduğunu düşünmüyorum ama tasarım gereği. Varsayılan davranışı değiştirmek WebDAV ile etkileşime girecek ve geriye dönük uyumluluğu bozacağını düşünüyorum. Bu, WebDAV yüklendiğinde IIS7 ile de çalışmadı.
Mark

Ben de bu konuda sadece 3 saat harcadım ... bu yazıdan 6 yıl sonra.
Brian Jenkins

Yanıtlar:


162

Tamam. Sonunda bunun altına girdim. PUT ve DELETE fiillerinin IIS8 ile düzgün çalışmasını sağlamak için bazı çembere atlamanız gerekir. Aslında, VS 2012'nin yayınlama adayını yükleyip yeni bir WEB API projesi oluşturursanız, örnek PUT ve DELETE yöntemlerinin kutudan 404 hata döndürdüğünü göreceksiniz.

PUT ve DELETE fiillerini Web API'sı ile kullanmak için% userprofile% \ document \ iisexpress \ config \ applicationhost.config dosyasını düzenlemeniz ve fiilleri şu şekilde ExtensionlessUrl işleyicisine eklemeniz gerekir:

Bu satırı değiştirin:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

için:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Yukarıdakilere ek olarak, WebDAV'ın isteklerinizi engellemediğinden emin olmalısınız. Bu, applicationhost.config dosyasından aşağıdaki satırları yorumlayarak yapılabilir.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

Ayrıca, varsayılan Web API kuralının yöntem adınızın çağrılan HTTP fiiliyle aynı olması gerektiğini unutmayın. Örneğin, bir HTTP silme isteği gönderiyorsanız, yönteminize varsayılan olarak Sil adı verilmelidir.


9
IIS8'deki OPTIONS fiiliyle ilgili benzer sorunlar için (işleyicilerinizden önce başka bir şeyin ele geçirildiği yerlerde) web.config dosyasında <remove name = "OPTIONSVerbHandler" /> öğesini deneyin. Bu nedenle, genel bir kural olarak mümkünse applicationhost.config ile mesajlaşma üzerinden yerel web.config dosyasında "remove" tekniğini kullanmanızı öneririm
Jason

7
WebDAV'ı takma etkilerine sahip olabilecek sunucu düzeyinde kaldırmak yerine, burada gösterildiği gibi projenizden kaldırmak daha iyidir: stackoverflow.com/a/14465655/428280
bükülmüş

Ve sonra ne? Hatta yerel olarak da çalışabilir, ancak Azure üzerinde çalışmaz
Toolkit

3
Dev makinelerde bile sistem ayarlarını değiştirmeyi söyleyen bir cevap, bir cevap olamaz. Bu bir semptomu çözer ve takımlara ve üretime gerçekten yardımcı olmaz. Bunu her makinede çoğaltacak mısınız? Santosh Sah yanıtını kontrol edin.
André Werlang

Buna ek olarak, Santosh Sah'in cevabınaWebDAVModule göre modülleri bölümünden de çıkarmam gerekiyordu .
Ivaylo Slavov

125

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

Düğümde <system.webServer>kodun altına ekleyin

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

Ekledikten sonra Web.Config dosyanız 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>

3
WebDavModule'u kaldırmak, bu sorunu gidermenin doğru yoludur.
MissRaphie

6
Günümü kaydetti: <modülleri runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar

3
Özel başlıklar, CORS ile ilgili olduklarından ve bu şekilde bir güvenlik açığı oluşturduğunuz için gerekli olmamalıdır. Sadece ilgili bölüm WebDAVModuleilgili.
André Werlang

2
Bu yanıt, işleyici adının IIS sürümleri arasında farklılık gösterebileceği tek istisna dışında doğrudur - örneğin 7.5, "ExtensionlessUrlHandler-Integrated-4.0"(yukarıdaki yanıtta olduğu gibi) kullanır, IIS 8.5'in adını değiştirmişse "ExtensionlessUrl-Integrated-4.0"( Mark S tarafından da belirtilmiştir) . .. hatayı aldıktan sonra, sete farklı barındırma ortamlarını desteklemek için her iki adlarını kullanan olduğunu bilmek önemsiz olmalıdır, böylece hata sayfası IIS
Ivaylo Slavov

7
Bunu her gördüğümde biraz ölmemi sağlıyor - runAllManagedModulesForAllRequests = "true" - bir çözüm olarak britishdeveloper.co.uk/2010/06/…
Oliver

61

WebDAV'ı kaldır davam için mükemmel çalışıyor:

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

Sorunu iis veya machine.config aracılığıyla düzeltmek yerine web.config aracılığıyla çözmek her zaman daha iyidir; uygulama başka bir makinede barındırılırsa bu olmaz


Bu benim için çalıştı, diğerleri nedense yoktu (IIS 8.5'teydi) teşekkürler
John

4
WebDAV'i Kaldır benim için çalıştı, işleyici WebDAV'ı kaldırmaya gerek yok (IIS 8.0).
PeterS

3
sadece webdav kaldırma 4.6.2 iis8.5 çerçeve üzerinde çalışır
Abdul Rehman Sayed

45

Web.config dosyanızı güncelleyin

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

Ana makine yapılandırmalarınızı değiştirme ihtiyacını ortadan kaldırır.


1
Zaten başka bir satır yazmıştım ama işe yaramıyordu. satırları ekledikten sonra <remove name = "WebDAVModule" /> ve <remove name = "WebDAV" /> şu anda çalışıyor. Çok teşekkürler & benim tarafımdan 1 oy.
Banketeshvar Narayan

Bu çalışır, ancak web.config dosyasında <modüllerin> kullanılmasını önleyen yapılandırma kilidi nedeniyle başarısız olabilir. Bu durumda, applicationHost.config dosyasında yapılandırma kilidini devre dışı bırakmanız gerekir. Herhangi bir nedenle applicationHost.config üzerinde kontrolünüz yoksa, bu yaklaşım kullanılamaz.
Florian Kış

Ben sadece fiil olarak "*" kullandım, ancak IIS10 ile çalıştı
Javier G.

1
IIS 10 ve Web API 2 ile çalıştı. Çalıştım, eklemeliyim, bir düzine "çözüm" daha sonra çevrimiçi buldum. Teşekkürler!
Matt West

@ChrisMarisic: Bu benim için bir cazibe gibi çalıştı teşekkürler!
Div Tiwari

18

Asp.Net Web API'sinde - webconfig. Bu, tüm tarayıcılarda çalışır.

System.web etiketi içine aşağıdaki kodu ekleyin

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

System.webserver etiketinizi aşağıdaki kodla değiştirin

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>


IIS 7.5'te bu sorunu yaşadım ve bu düzeltme mükemmel çalıştı. Tüm system.webserver içeriğimi silmek yerine, yukarıdaki ilgili ayarları kendi ayarlarımla birleştirdim.
Keith Walton

38
DİKKAT : Yukarıdaki koddaki özel başlıklar bölümü, HERHANGİ BİR sitenin API'nizi tarayıcıdan aramasına olanak tanır - bu büyük bir güvenlik riski oluşturur . Bu başlıkların etkin bir şekilde sağladığı CORS'ı okuyun.
profMamba

Ayrıca iis 7.5 üzerinde bu sorunu vardı ve bu çalıştı. Toolkit'in yukarıda cors'u herkese açma riskiyle ilgili mesajını okuduğunuzdan emin olun. Ayrıca yorumunu onaylayın çünkü böyle çok değerli bir şey var.
sjdirect

Bu durumda özel başlıklara ihtiyacınız olduğunu düşünmüyorum. Bölümün geri kalanı system.webserveryeterli olmalıdır - sadece uzantısız url işleyici için doğru ada sahip olduğunuzdan emin olun .
Ivaylo Slavov

1
@niico Yalnızca güvenilen sitelerin Access-Control-Allow-Origin'e izin vermesi gerekir, yani "*" yerine web sitenizin URL'lerini koyun. Tüm web'e (genellikle kötü bir fikirdir) güvenmek istemiyorsanız, bu özellik tüm güvenilir sitelerin beyaz listesidir.
profMamba

5

bu benim için iis8'de diğer bazı cevaplarla birlikte çalıştı. Benim hatam özellikle 404.6 idi

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>

AppCmd ​​çalıştırdığınızda, bu web.Config koyar (appToWebDAV bit dışında).
Chase Florell

5

Bu sorunla karşılaşabilecek herkes için hızlı bir güncelleme. Bugün itibariyle,% userprofile% \ document \ iisexpress \ config \ applicationhost.config dosyasının değiştirilmesi artık çalışmıyor (şimdiye kadar iyi çalışıyordu, bunun bir Windows güncellemesinden kaynaklanıp kaynaklanmadığından emin değilim). Saatler süren hayal kırıklığından sonra, web.config dosyasını değiştirerek bu işleyicileri system.webserver uygulamasına ekledim.

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

4

CORS'u etkinleştir (güzel ve temiz)

1.CORS nuget paketi ekleyin

Install-Package microsoft.aspnet.webapi.cors

2. Kayıt yöntemine WebApiConfig.cs dosyasında feryat kodu ekleyin:

config.EnableCors();

ör .:
System.Web.Http kullanarak;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

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

3. denetleyicinin ad alanına feryat kodu ekleyin get, post, delete, put veya herhangi bir http yöntemi

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

örn:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

başvuru: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api


4

Hiçbir şey işe yaramazsa, bunu aşağıdaki adımlarla çözebildim:

• IIS'yi yüklerken 'WEB DAV PUBLISHING' IIS ayarlarını seçmediniz. • INETMGR - Varsayılan Web Sitesi - İstek Filtreleme - HTTP Fiilleri - PUT as True


3

Sonsuz arama ve zaten verilen cevapları denedikten sonra (PUT ekleyerek, fiilleri silin ve WEBdav kaldır) işe yaramadı.

IIS günlük kaydı ayarlarına gittim:> Günlük Dosyalarını Görüntüle. Benim durumumda W3SVC4 en son tarihe sahip klasördü, klasörü açtı, en son günlük dosyasına baktı ve şu girişi gördü: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

Güncelleme yöntemi GET fiiliyle listelendi, garip değil mi? Reddedildi-UrlScan için Googled ve bu bağlantıyı buldum: UrlScan Blogumu Kırdı .

Buraya gittim:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

Temel olarak, UrlScan PUT ve DELETE fiillerini engelledi. Bu INI dosyasını açtım, PUT ve DELETE AllowVerbs ekledim ve DenyVerbs listesinden kaldırdım. INI dosyasını kaydettim ve işe yaradı! Bu yüzden benim için ExtensionlessUrlHandler ipuçlarının yanında bu adımlar gerekliydi.

Windows Webserver 2008 R2 (64 bit), IIS 7.5. Ben DotNetNuke (DNN) WebAPI ile birlikte kullanıyorum. ASP.Net 4.0 Güncelleme yöntemim:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)

3

PHP için, basitçe:

  1. IIS'yi aç
  2. İşleyici Eşlemelerine Git
  3. php5.6.x veya php7.0.x üzerinde düzenle'yi tıklayın
  4. "istek kısıtlamaları" nı tıklayın
  5. fiiller sekmesinin altında, "aşağıdaki fiillerden birini" seçin ve "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS" ekleyin

Bunun diğer işleyicilerle de çalışacağını düşünüyorum.


2

Yukarıdaki tüm çözümlerin yanı sıra, " id " veya DELETE yönteminde herhangi bir özel tanımlı parametrenin route config ile eşleşip eşleşmediğini kontrol edin.

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

Tekrarlanan 405 hatalarıyla 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 olarak URL'de kimliği arayacaktır . Bu nedenle parametre adı kimliği , App_Start altında rota yapılandırmasını değiştirmediğiniz sürece burada önemlidir klasörü .

Sen veri türünü değiştirebilir idBununla .

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

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

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

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

Misal:

DELETE http://localhost/item/1

Umarım yardımcı olur.


2

Seninle aynı sorunu yaşadım, sonra çözdüm, İşte çözümler, keşke belki yardımcı olabilir
İlk

IIS'de modules Yapılandırmasında, Web sunucunuzda varsa WebDAVModule'u döndürün , sonra kaldırın

İkinci

IIS handler mappingsyapılandırmasında, etkinleştirmek için etkinleştirici işleyicisinin listesini görebilirsiniz.the PHP item , düzenleyebilir, düzenleme sayfasında istek kısıtlamaları düğmesini tıklatabilir, ardından the verbs tabmodda, işlenecek etiketi belirleyecek fiillerdeall verbs radio sonra, Tamam'ı tıklayın, belki de bir uyarı görüyorsunuz, PHP-CGI yürütmesi için çift tırnak işareti kullandığını gösteriyor, sonra yap

tamamlandıysa, IIS sunucusunu yeniden başlatın, tamam olacak

resim açıklamasını buraya girin


1
WebDAVModule'u yalnızca IIS web sitesinden kaldırdım ve bu benim için çalıştı
Umair Malhi

1

Doğru yapılandırma dosyasını düzenleyip düzenlemediğinizden emin değilim. Aşağıdaki adımları deneyin

  1. % userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config dosyasını açın

  2. Varsayılan olarak aşağıdaki girişler applicationhost.config dosyasında yorumlanır. bu girişleri kaldır.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


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

4
applicationhost.config ile dalga mı geçiyorsunuz? nope
Toolkit

Uygulama yapılandırma dosyası dışında biriyle karıştırılmamalıdır. İlk önce bunu tüm sunucu için yapacak ve unutacaksınız, o zaman birçok insan bunun makinede nasıl çalıştığını ve geri kalanında çalışmadığını merak edecek. Ayrıca, uygulamanın barındırıldığı sunucudaki IIS yapılandırma dosyasına erişim izniniz yoksa, dosyayı web.config dosyasında çalıştırmanız gerekir. Dev sunucunuzda yukarıdaki güncellemenin bulunduğunu düşünün, web.config dosyanız doğru mu olacak? Üretim dağıtımının neden başarısız olduğunu araştıran birinin gününü kaybetmenin harika bir yolu
Ivaylo Slavov

1

IIS Yöneticisi GUI'sini kullanarak ek HTTP Fiillerine nasıl izin vereceğiniz aşağıda açıklanmıştır.

  1. IIS Yöneticisi'nde PUT veya DELETE öğesine izin vermek istediğiniz siteyi seçin.

  2. "Filtreleme İste" seçeneğini tıklayın. "HTTP Fiiller" sekmesini tıklayın.

  3. Kenar çubuğundaki "Fiile İzin Ver ..." bağlantısını tıklayın.

  4. Görünen kutuya "SİL" yazın, Tamam'a tıklayın.

  5. Kenar çubuğundaki "Fiile İzin Ver ..." bağlantısını tekrar tıklayın.

  6. Görüntülenen kutuya "PUT" yazın, Tamam'ı tıklayın.


güzel deneyin - bir kez farklı bir şey - ama yine de işe yaramadı!
ozzy432836

Ben SO ve başka bir yerde önerilen gördüğüm her şeyi denemişti. Sonunda bunu denedim ve mükemmel çalıştı. Benim durumumda, PUT ve DELETE fiilleri zaten listede vardı ve önce bunları kaldırmak, sonra Fiili İzin Ver ... bağlantısını kullanarak geri eklemek zorunda kaldım, ama yine de, başka hiçbir şey olmadığında çalıştı. Çok teşekkür ederim!
JTennessen

1

MVC uygulamasında bir ashx dosyası kullanıyorum ve yukarıdaki cevapların hiçbiri benim için çalışmadı. IIS 10.

İşte işe yarayan. Yerine değişen " ExtensionlessUrl-Entegre-4.0 " IIS veya ben "değişti web.config SimpleHandlerFactory-Entegre-4.0 " için " * .ashx " dosyaları:

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />

0

Başka bir neden olabilir:
Web Api için Url yöntemimi bu cevaba göre değiştirdim :

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

Ancak bu yöntem aşağıdaki gibi bir bağlantı oluşturur:

/api/MyApiCtrl?action=MyAction

Bu, GET ve POST istekleriyle doğru çalışır, ancak PUT veya DELETE ile çalışmaz.
Bu yüzden sadece onunla değiştirdim:

/api/MyApiCtrl

ve sorunu çözdü.


0

IIS 8.5 / Windows 2012R2'de, burada belirtilen hiçbir şey benim için çalışmadı. WebDAV'ı kaldırarak ne anlama geldiğini bilmiyorum ama bu benim için sorunu çözmedi.

Bana yardımcı olan şu adımlar;

  1. IIS yöneticisine gittim.
  2. Sol panelde siteyi seçti.
  3. Sol çalışma alanında WebDAV'ı seçti, çift tıklayarak açıldı.
  4. En sağdaki panelde devre dışı bırakıldı.

Şimdi her şey çalışıyor.


-1

Delete yönteminizi POST olarak şu şekilde dönüştürebilirsiniz;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
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.