ASP.NET Web API - PUT & DELETE Verbs Niedozwolone - IIS 8

145

Niedawno zaktualizowałem program Visual Studio 2010 do Visual Studio 2012 RC. Instalator instaluje również usługi IIS 8 Express, których program Visual Studio używa teraz jako domyślny serwer sieci Web.

IIS 8 blokuje żądania WEB API, które używają czasowników PUT AND DELETE. IIS zwraca błąd 405,The requested resource does not support http method 'PUT' .

Wiem, że ludzie mieli z tym problemy w przeszłości i jest kilka wiadomości na ten temat w Stack Overflow. W przypadku IIS 7 Express rozwiązaniem było odinstalowanie WebDav. Niestety nie widzę sposobu, aby to zrobić z IIS 8.

Próbowałem edytować sekcje WebDav z applicationhost.config, ale to nie pomogło. Na przykład usunąłem<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> z pliku konfiguracyjnego.

Spędziłem nad tym o wiele za długo. Musi istnieć prosty sposób na włączenie funkcji PUT i DELETE?

znak
źródło
To wciąż zepsute w wersji RTM. Właśnie zmarnowałem na to 3 godziny ... Wszystko, co było potrzebne, to dodać dodatkowe czasowniki ExtensionlessUrl-Integrated-4.0.
leppie
1
Nie sądzę, żeby to było zepsute, ale jest zgodne z projektem. Myślę, że zmiana domyślnego zachowania kolidowałaby z WebDAV i złamałaby kompatybilność wsteczną. Nie działało to również z usługami IIS7 po zainstalowaniu protokołu WebDAV.
Mark
Po prostu zmarnowałem na to 3 godziny ... 6 lat po tym poście.
Brian Jenkins
proszę spojrzeć na stackoverflow.com/a/55134621/4746570
BehrouzMoslem

Odpowiedzi:

162

W porządku. W końcu dotarłem do sedna tego. Musisz przeskoczyć przez kilka obręczy, aby czasowniki PUT i DELETE działały poprawnie z usługami IIS8. W rzeczywistości, jeśli zainstalujesz wersję Release Candidate VS 2012 i utworzysz nowy projekt WEB API, okaże się, że przykładowe metody PUT i DELETE zwracają błędy 404 po wyjęciu z pudełka.

Aby użyć czasowników PUT i DELETE z interfejsem API sieci Web, musisz edytować% userprofile% \ documents \ iisexpress \ config \ applicationhost.config i dodać czasowniki do modułu obsługi ExtensionlessUrl w następujący sposób:

Zmień tę linię:

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

do:

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

Oprócz powyższego upewnij się, że WebDAV nie koliduje z Twoimi żądaniami. Można to zrobić, wykomentowując następujące wiersze z pliku applicationhost.config.

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

Należy również pamiętać, że domyślna konwencja interfejsu API sieci Web polega na tym, że nazwa metody powinna być taka sama, jak wywoływana zlecenie HTTP. Na przykład, jeśli wysyłasz żądanie usunięcia HTTP, Twoja metoda powinna mieć domyślnie nazwę Delete.

znak
źródło
9
W przypadku podobnych problemów z czasownikiem OPTIONS w IIS8 (gdzie coś innego przechwytuje przed twoimi programami obsługi) spróbuj <remove name = "OPTIONSVerbHandler" /> w pliku web.config. W związku z tym radziłbym z zasady używać techniki „usuwania” w lokalnym pliku web.config zamiast mieszania się z applicationhost.config, jeśli to możliwe
Jason
7
Zamiast usuwać WebDAV na poziomie serwera, który może powodować efekt domina, lepiej jest usunąć go z projektu, jak pokazano tutaj: stackoverflow.com/a/14465655/428280
Twisted
I co wtedy? Może nawet będzie działać lokalnie, ale nie będzie działać na platformie Azure
Toolkit
3
Odpowiedź nakazująca modyfikację ustawień systemu, nawet na maszynach deweloperskich, nie może być odpowiedzią. To rozwiązuje problem i tak naprawdę nie pomaga w zespołach i na produkcji. Czy odtworzysz to na każdej maszynie? Sprawdź odpowiedź Santosh Sah.
André Werlang
Ponadto musiałem również usunąć WebDAVModulez sekcji modułów, zgodnie z odpowiedzią Santosh Sah .
Ivaylo Slavov
125

Zmień plik Web.Config jak poniżej. Będzie działać jak urok.

W węźle <system.webServer>dodaj poniższą część kodu

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

Po dodaniu Twój Web.Config będzie wyglądał jak poniżej

<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
źródło
3
Usunięcie WebDavModule to właściwy sposób na rozwiązanie tego problemu.
MissRaphie,
6
Zapisane mój dzień: <moduły runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar
3
Niestandardowe nagłówki nie powinny być potrzebne, ponieważ są powiązane z mechanizmem CORS i w ten sposób wywołujesz lukę w zabezpieczeniach. Tylko ta część, która dotyczy, WebDAVModulejest istotna.
André Werlang
2
Ta odpowiedź jest poprawna, z jedynym wyjątkiem, że nazwa programu obsługi może się różnić w różnych wersjach usług IIS - na przykład używa 7.5 "ExtensionlessUrlHandler-Integrated-4.0"(jak w powyższej odpowiedzi), podczas gdy IIS 8.5 ma zmienioną nazwę na "ExtensionlessUrl-Integrated-4.0"(również wspomniana przez Marka S. Nazwa procedury obsługi jest pokazana w stronę błędu IIS, gdy pojawi się błąd, więc wiedza, którą ustawić, powinna być banalna. Używam obu nazw w celu obsługi różnych środowisk hostingowych.
Ivaylo Slavov
7
To sprawia, że ​​umieram trochę w środku za każdym razem, gdy to widzę - runAllManagedModulesForAllRequests = "true" - jako rozwiązanie britishdeveloper.co.uk/2010/06/…
Oliver
61

Usuń WebDAV działa idealnie w moim przypadku:

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

zawsze lepiej jest rozwiązać problem przez web.config zamiast naprawiać go za pomocą iis lub machine.config, aby zagwarantować, że nie stanie się to, jeśli aplikacja będzie hostowana na innym komputerze

Peter Wang
źródło
To zadziałało dla mnie, podczas gdy inni nie z jakiegoś powodu (było w IIS 8.5), dzięki
Jan
4
Usuń moduł WebDAVModule działał dla mnie, nie ma potrzeby usuwania modułu obsługi WebDAV (IIS 8.0).
PeterS
3
samo usunięcie działa webdav na frameworku 4.6.2 iis8.5
Abdul Rehman powiedział
45

Zaktualizuj plik web.config

  <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

Eliminuje potrzebę modyfikowania konfiguracji hosta.

Chris Marisic
źródło
1
Napisałem już inną linię, ale nie działała. po dodaniu linii <remove name = "WebDAVModule" /> i <remove name = "WebDAV" /> już działa. Wielkie dzięki i 1 głos pozytywny z mojej strony.
Banketeshvar Narayan
To działa, ale może się nie powieść z powodu blokowania konfiguracji uniemożliwiającego użycie <modules> w web.config. W takim przypadku musisz wyłączyć blokadę konfiguracji w applicationHost.config. Jeśli z jakiegoś powodu nie masz kontroli nad applicationHost.config, nie możesz użyć tego podejścia.
Florian Winter,
Pracowałem z IIS10, chociaż użyłem tylko „*” jako czasownika
Javier G.
1
Pracowałem z IIS 10 i Web API 2. Działało, dodam, po kolejnych kilkunastu „rozwiązaniach”, które znalazłem online, nie działało. Dzięki!
Matt West
@ChrisMarisic: To zadziałało dla mnie jak urok, dzięki!
Div Tiwari
18

W Asp.Net Web API - webconfig. Działa to we wszystkich przeglądarkach.

Dodaj następujący kod wewnątrz tagu System.web

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

Zastąp swój tag system.webserver poniższym kodem

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

Ganesh
źródło
Miałem ten problem w IIS 7.5 i ta poprawka działała idealnie. Zamiast usuwać całą zawartość mojego serwera system.webserver, po prostu połączyłem odpowiednie ustawienia powyżej z własnymi ustawieniami.
Keith Walton,
38
OSTRZEŻENIE : Sekcja niestandardowych nagłówków w powyższym kodzie umożliwia KAŻDEJ witrynie wywoływanie interfejsu API z przeglądarki - co stanowi duże zagrożenie bezpieczeństwa . Przeczytaj o CORS, który jest efektywnym tym, co umożliwiają te nagłówki.
profMamba
Miałem również ten problem na iis 7.5 i to zadziałało. Nie zapomnij przeczytać powyższej wiadomości Toolkit o ryzyku związanym z otwarciem corsów dla wszystkich. Głosuj również za jego komentarzem, ponieważ takie ciekawostki są bardzo cenne.
sjdirect
Myślę, że w tym przypadku w ogóle nie potrzebujesz niestandardowych nagłówków. Reszta system.webserversekcji powinna wystarczyć - po prostu upewnij się, że masz odpowiednią nazwę dla obsługi bez rozszerzeń adresów URL.
Ivaylo Slavov
1
@niico Należy zezwalać tylko zaufanym witrynom na Access-Control-Allow-Origin, tj. zamień „*” na adres URL swojej witryny. Ta właściwość to biała lista wszystkich zaufanych witryn, chyba że chcesz ufać całej sieci (co jest zazwyczaj złym pomysłem).
profMamba
5

działało to dla mnie na iis8 razem z niektórymi innymi odpowiedziami. Mój błąd to 404.6

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
Sico
źródło
kiedy uruchamiasz AppCmd, to jest to, co umieszcza w twoim web.Config (z wyjątkiem bitu applyToWebDAV).
Chase Florell
5

Tylko szybka aktualizacja dla każdego, kto może napotkać ten problem. Od dzisiaj zmiana% userprofile% \ documents \ iisexpress \ config \ applicationhost.config NIE działa już (do tej pory działało dobrze, nie jestem pewien, czy jest to spowodowane aktualizacją systemu Windows). Po wielu godzinach frustracji zmieniłem plik web.config, aby dodać te moduły obsługi do system.webserver, aby działał:

<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>
Hari
źródło
4

Włącz CORS (ładny i schludny)

1.Dodaj pakiet CORS nuget

Install-Package microsoft.aspnet.webapi.cors

2. w pliku WebApiConfig.cs do metody Register dodaj poniższy kod:

config.EnableCors();

np.
przy użyciu System.Web.Http;

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. Dodaj poniższy kod do przestrzeni nazw kontrolera, w tym get, post, delete, put lub dowolną metodę http

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

dawny:

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

źródło: http://www.asp.net/web-api/overview/security/eniring-cross-origin-requests-in-web-api

zokaee hamid
źródło
4

Gdy nic nie działało, udało mi się to rozwiązać, wykonując poniższe czynności:

• Nie wybrano ustawień IIS „WEB DAV PUBLISHING” podczas instalacji usług IIS. • INETMGR - Witryna domyślna - Filtrowanie żądań - Zlecenia HTTP - PUT jako prawda

Anshuman Saurabh
źródło
3

Po niekończących się poszukiwaniach i próbowaniu już dostarczonych odpowiedzi (dodawanie czasowników PUT, DELETE i usuwanie WEBdav) po prostu nie zadziałało.

Poszedłem do ustawień rejestrowania IIS:> Wyświetl pliki dziennika. W moim przypadku W3SVC4 był folderem z najnowszą datą, otworzył folder, wyszukał najnowszy plik dziennika i zobaczył ten wpis: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

Metoda aktualizacji została wymieniona z czasownikiem GET, dziwne, prawda? Więc wyszukałem w Google Odrzucenie przez UrlScan i znalazłem ten link: UrlScan zepsuł mój blog .

Udałem się tutaj:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

Zasadniczo UrlScan zablokował czasowniki PUT i DELETE. Otworzyłem ten plik INI, dodałem PUT i DELETE do AllowVerbs i usunąłem je z list DenyVerbs. Zapisałem plik INI i zadziałało! Więc dla mnie te kroki były konieczne obok wskazówek ExtensionlessUrlHandler.

Windows Webserver 2008 R2 (64-bitowy), IIS 7.5. Używam tego w połączeniu z DotNetNuke (DNN) WebAPI. ASP.Net 4.0 Moja metoda aktualizacji:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
CWU
źródło
3

W przypadku PHP było to po prostu:

  1. Otwórz IIS
  2. Przejdź do mapowania obsługi
  3. kliknij edytuj na php5.6.x lub php7.0.x
  4. kliknij „prośba o ograniczenia”
  5. na karcie czasowników wybierz „jeden z następujących czasowników” i dodaj „GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS”

Wyobrażam sobie, że to zadziała również z innymi przewodnikami.

Frank Forte
źródło
2

Oprócz wszystkich powyższych rozwiązań sprawdź, czy masz " id " lub jakikolwiek niestandardowy parametr zdefiniowany w metodzie DELETE pasuje do konfiguracji trasy.

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

Jeśli trafisz z powtarzającymi się błędami 405, lepiej zresetuj podpis metody do domyślnej, jak powyżej, i spróbuj.

Konfiguracja trasy domyślnie będzie szukać identyfikatora w adresie URL. Więc identyfikator nazwy parametru jest tutaj ważny, chyba że zmienisz konfigurację trasy w App_Start folderze .

Możesz zmienić typ danych identyfikatora .

Na przykład poniższa metoda powinna działać dobrze:

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

Uwaga: upewnij się również, że przekazujesz dane przez adres URL, a nie metodę danych, która będzie przenosić ładunek jako treść.

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

Przykład:

DELETE http://localhost/item/1

Mam nadzieję, że to pomoże.

Bieg
źródło
2

Miałem z tobą ten sam problem, a potem go rozwiązałem, oto rozwiązania, chciałbym, żeby to mogło pomóc
Po pierwsze

W moduleskonfiguracji usług IIS zapętl moduł WebDAVModule , jeśli Twój serwer sieciowy go ma, a następnie usuń go

druga

W handler mappingskonfiguracji IIS możesz zobaczyć listę the PHP itemwłączonych handlerów, aby wybrać , edytować, na stronie edycji kliknij przycisk ograniczenia żądania, a następnie wybierz the verbs tabw trybie modalnym, w określ etykietę czasowników do obsługi, zaznaczall verbs radio , a następnie kliknij ok, możesz również zobaczyć ostrzeżenie, pokazuje nam, że używaj podwójnych cudzysłowów do wykonywania PHP-CGI, a następnie zrób to

jeśli to zrobisz, uruchom ponownie serwer IIS, wszystko będzie dobrze

wprowadź opis obrazu tutaj

Chauncery
źródło
1
Usunąłem tylko moduł WebDAVModule ze strony internetowej IIS i to zadziałało
Umair Malhi
1

Nie jestem pewien, czy edytowałeś właściwy plik konfiguracyjny. Spróbuj wykonać następujące czynności

  1. otwórz% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

  2. Domyślnie podane poniżej wpisy są komentowane w pliku applicationhost.config. odkomentuj te wpisy.

<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"
 />
vikomall
źródło
4
mieszać z applicationhost.config? nie
Zestaw narzędzi
Nie należy zadzierać z innymi plikami niż z plikiem konfiguracyjnym aplikacji. Po pierwsze - zrobisz to dla całego serwera i zapomnisz, wtedy wiele osób będzie się zastanawiać, jak to działa na tym komputerze, a nie działa na pozostałych. Ponadto, jeśli nie masz dostępu do pliku konfiguracyjnego usług IIS na serwerze, na którym hostowana jest aplikacja, będziesz musiał to rozpracować w pliku web.config. Wyobraź sobie, że twój serwer deweloperski ma powyższą aktualizację, czy twój plik web.config będzie dokładny? To świetny sposób, aby stracić czyjś dzień na zbadaniu, dlaczego wdrożenie produkcyjne się nie powiodło
Ivaylo Slavov
1

Oto jak zezwolić na dodatkowe zlecenia HTTP przy użyciu interfejsu GUI Menedżera usług IIS.

  1. W Menedżerze usług IIS wybierz witrynę, dla której chcesz zezwolić na PUT lub DELETE.

  2. Kliknij opcję „Poproś o filtrowanie”. Kliknij kartę „HTTP Verbs”.

  3. Kliknij link „Zezwalaj na czasownik ...” na pasku bocznym.

  4. W wyświetlonym polu wpisz „USUŃ”, kliknij OK.

  5. Kliknij ponownie łącze „Zezwalaj na czasownik ...” na pasku bocznym.

  6. W wyświetlonym polu wpisz „PUT”, kliknij OK.

Chaoix
źródło
niezła próba - chociaż raz coś innego - ale nadal nie działało!
ozzy432836
Próbowałem wszystkiego innego, co widziałem, sugerowanego na SO i gdzie indziej. W końcu spróbowałem i zadziałało idealnie. W moim przypadku czasowniki PUT i DELETE były już na liście i musiałem je najpierw usunąć, a następnie dodać z powrotem za pomocą linku Allow Verb ..., ale nadal działało, gdy nic innego nie było. Dziękuję bardzo!
JTennessen,
1

Używam pliku ashx w aplikacji MVC i żadna z powyższych odpowiedzi nie zadziałała. IIS 10.

Oto, co zadziałało. Zamiast zmieniać „ ExtensionlessUrl-Integrated-4.0 ” w IIS lub web.config, zmieniłem „ SimpleHandlerFactory-Integrated-4.0 ” na pliki „ * .ashx ”:

<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" />
RC Cola
źródło
0

Innym powodem może być:
Zmieniłem adres URL dla interfejsu API sieci Web zgodnie z tą odpowiedzią :

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

Ale ta metoda tworzy link taki jak:

/api/MyApiCtrl?action=MyAction

Działa to poprawnie z żądaniami GET i POST, ale nie z PUT lub DELETE.
Więc po prostu zastąpiłem go:

/api/MyApiCtrl

i rozwiązało problem.

Nicolai
źródło
0

W usługach IIS 8.5 / Windows 2012R2 nic, co zostało tu wymienione, nie działało. Nie wiem, co oznacza usunięcie WebDAV, ale to nie rozwiązało problemu.

Pomogły mi poniższe kroki;

  1. Poszedłem do menedżera IIS.
  2. W lewym panelu wybrano witrynę.
  3. W lewym obszarze roboczym zaznaczono WebDAV, otworzyłem go dwukrotnie klikając.
  4. W prawym skrajnym panelu wyłącz go.

Teraz wszystko działa.

umiejętności
źródło
-1

Możesz przekonwertować swoją metodę Delete na POST jako;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
Teoman shipahi
źródło