„Metoda 405 niedozwolona” w IIS7.5 dla metody „PUT”

113

Używam WebClienttypu do przesyłania plików * .cab na mój serwer. Po stronie serwera zarejestrowałem obsługę HTTP dla pliku * .cab metodą PUT jak poniżej:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

Ale zawsze pojawia się błąd „405 metoda niedozwolona”. W odpowiedzi stwierdzono, że dozwolone metody są następujące:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

Nawet jeśli wyraźnie zezwalam na metodę PUT w filtrowaniu żądań usług IIS dla mojej aplikacji sieci Web, nadal występuje ten sam błąd.

Podejrzewam, że jest to problem związany z usługami IIS. Mam nadzieję, że ktoś mógłby rzucić na to trochę światła.

smwikipedia
źródło

Odpowiedzi:

214

Często ten błąd jest spowodowany przez moduł WebDAV, który próbuje obsłużyć tego rodzaju żądania. Łatwym rozwiązaniem jest usunięcie go z modułów i programów obsługi system.webServersekcji znajdującej się bezpośrednio w pliku web.config. Oto przykład konfiguracji:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Davide Icardi
źródło
2
Korzystając z następującego artykułu MS, dodałem tag usuwania do programów obsługi, ale nadal nie działał. Dzięki twojej odpowiedzi widzę, że potrzebowałem go również dodać do sekcji modułów. Bardzo cenione. Oto artykuł: asp.net/web-api/overview/testing-and-debugging/ ...
Tod Birdsall
Świetnie, zaoszczędziłeś mi godzin bolesnego debugowania! :)
Kaspars Ozols
Prosta i łatwa naprawa, dzięki!
MorenajeRD
Próbowałem tego, ale nie działa na mnie. Nadal pojawia się błąd 405 - metoda niedozwolona. Zauważ, że używam IIS Express i błąd występuje tylko w PUT, ale działa w przypadku GET, POST AND DELETE.
Thierry,
47

Włączyłem śledzenie nieudanych żądań i otrzymałem następujące informacje:

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

Więc odinstalowałem moduł WebDAVModule z moich usług IIS, teraz wszystko jest w porządku ~

Funkcja śledzenia usług IIS jest bardzo pomocna.

smwikipedia
źródło
1
Dziękuję za odpowiedź ! Po 2 dniach poszukiwań jedynym działającym rozwiązaniem, które pozwoliło mi uniknąć „405 Metoda niedozwolona”, było zdefiniowanie nagłówków CORS w Application_BeginRequestmetodzie, jak wspomniano w tej odpowiedzi stackoverflow.com/a/14631068/827168 . Ale twoja odpowiedź jest lepsza niż wszystkie inne, ponieważ pomaga wykryć problem zamiast zastosować jakąś losową łatkę :)
pomeh
@pomeh Zawsze wierzę w kompletną logikę. :)
smwikipedia
1
@Demodave Sprawdź tutaj: technet.microsoft.com/en-us/library/cc731223%28v=ws.10%29.aspx
smwikipedia
1
Uwaga, powinieneś również przejść do Mapowania obsługi i usunąć stamtąd WebDAV, w przeciwnym razie otrzymasz komunikat o błędzie Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb
26

Miałem ten problem z WebDAV podczas hostowania projektu MVC4 WebApi. Obejrzałem to, dodając tę ​​linię do pliku web.config:

<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule"
      resourceType="Unspecified" requireAccess="None" />
</handlers>

Jak wyjaśniono tutaj: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html

Nacięcie
źródło
Najlepsze rozwiązanie dla kogoś, kto faktycznie potrzebuje WebDAV. To, czy ktoś potrzebuje WebDAV, to osobna dyskusja.
MrBoJangles
24

Zaczerpnięte stąd i zadziałało dla mnie:

1 Przejdź do Menedżera usług IIS.

2. Kliknij swoją aplikację.

3. Przejdź do „Mapowania obsługi”.

4. Na liście funkcji kliknij dwukrotnie „WebDAV”.

5. Kliknij „Request Restrictions”.

6. W zakładce „Czasowniki” wybierz „Wszystkie czasowniki”.

7. naciśnij OK.

goran85
źródło
3
Pomogło mi to, ale wyjaśnię to na podstawie mojego doświadczenia. 2. (Usługa sieciowa). 3. Kliknij dwukrotnie ikonę Handler Mappings na środkowym panelu.
Gary,
19

Wypróbowałem większość odpowiedzi i niestety żadna z nich nie zadziałała.

Oto, co zadziałało dla mnie. Istnieją 3 rzeczy do zrobienia w witrynie, dla której chcesz PUT (wybierz witrynę):

  1. Otwórz, WebDav Authoring Rulesa następnie wybierz Disable WebDAVopcję obecną na prawym pasku.

  2. Wybierz Modules, znajdź WebDAV Modulei usuń.

  3. Wybierz HandlerMapping, znajdź WebDAVHandleri usuń.

Uruchom ponownie usługi IIS.

coding_idiot
źródło
To działa! Nie wiem, czy wszystkie 3 kroki można wykonać, edytując plik web.config, ale ułatwiło to korzystanie tylko z konsoli zarządzania usługami IIS. Zwróć uwagę, że istnieją 3 wpisy HandlerMapping zaczynające się od WebDAV * - usunąłem wszystkie 3 i życie było dobre.
SlimsGhost
1
Próbowałem odinstalować WebDav i nie zadziałało. Następnie wykonałem wszystkie trzy powyższe kroki i PUTzacząłem pracować.
Rareyesdev
1
Kroki 2 i 3 można zastosować do katalogu wirtualnego bez wpływu na pozostałą część witryny.
Tonatio,
1
Wielkie dzięki. uratowałeś mnie. Po 7 godzinach frustracji wypróbowałem wszystkie odpowiedzi, jakie mogłem, i wreszcie trafiła mnie Twoja odpowiedź. :)
Zeeshan Safdar
1
Dzięki, to jest to.
Ahmad Hamdy
17

Usunięcie modułu WebDAV powinno wystarczyć. Po prostu zmień swój plik Web.config:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
Dunken
źródło
14

Najlepiej po prostu usunąć nieużywaną funkcję WebDAV. Przejdź do Programy i funkcje => Włącz lub wyłącz funkcje systemu Windows i wyłącz publikowanie WebDAV pod

Internetowe usługi informacyjne => World Wide Web Services => Wspólne funkcje HTTP

wprowadź opis obrazu tutaj

SliverNinja - MSFT
źródło
Dzięki ! To całkowicie rozwiązało mój problem!
wmehanna
4

Z jakiegoś powodu oznaczenie WebDAVModule jako „usuń” w moim pliku web.config nie wystarczyło, aby rozwiązać problem w moim przypadku.

Znalazłem innego podejścia, które nie rozwiąże problemu. Jeśli jesteś na tej samej łodzi, spróbuj tego:

  1. W Menedżerze usług IIS wybierz aplikację, która musi obsługiwać PUT.
  2. W widoku funkcji znajdź Reguły tworzenia WebDAV . Kliknij go dwukrotnie lub wybierz Otwórz element z menu kontekstowego (kliknij prawym przyciskiem myszy).
  3. W okienku Actions, znajdź i kliknij WebDAV Ustawienia ... .
  4. W ustawieniach WebDAV znajdź Zachowanie filtrowania żądań , a poniżej znajdź Zezwalaj na filtrowanie czasowników . Ustaw opcję Zezwalaj na filtrowanie czasowników na wartość Fałsz .
  5. W okienku Akcje kliknij Zastosuj .

Zapobiega to odrzucaniu przez WebDAV czasowników, których nie obsługuje, umożliwiając w ten sposób przepływ PUT do programu obsługi RESTful bez przeszkód.

Dan K.
źródło
4

Kolejna wskazówka ode mnie. Użyłem PHP + IIS, a mapowanie obsługi dla PHP nie miało czasownika PUT.

Idź do IIS Manager-> Your site-> Handler Mappings-> PHPxx_via_FastCGI-> Request Restrictions-> Verbs, a następnie dodaj PUT.

Otóż ​​to!

Stefana Pintilie
źródło
1
To jest odpowiedź, której potrzebują użytkownicy php.
SpeedOfRound
4

Kolejnym ważnym modułem, który wymaga rekonfiguracji, zanim zaczną działać PUT i DELETE, jest czasownik opcji

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

Zobacz także ten post: https://stackoverflow.com/a/22018750/9376681

Michael Radhuber
źródło
3

Używałem Angular 8 i miałem .NET core API. Dodaję następujący plik w moim pliku web.config usługi. To rozwiązuje mój błąd.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>
atik sarker
źródło
2

Dla mnie ten błąd nie zniknął i nie pozwolił na metody PUT, cokolwiek zrobiłem .. odinstalowałem webdav, umieściłem konfigurację w web.config, aby usunąć webdav z modułów obsługi i modułów, i ustawiłem PUT jako dozwolony czasownik w filtrach żądań w iis .. i upewnij się, że mapowania programu obsługi iis obsługujące żądanie mają skonfigurowane PUT.

Mój problem był ostatecznie spowodowany złą instalacją rozszerzeń ASP.NET 4.5. Usunięto wszystko, co dotyczy asp.net, z ról i funkcji serwera. uruchomiony ponownie. przeczytałem role i uruchomiłem ponownie. wszystko działało z powyższą konfiguracją.

--- Poniższe informacje spowodują akceptację PUT, ale wyślą je do niewłaściwego programu obsługi. - zignoruj ​​poniższe

na koniec dodanie czasownika PUT jako dozwolonego czasownika w mapowaniu obsługi TRACE w iis działało .. ponieważ włączyłem śledzenie błędów zakończonych niepowodzeniem, a ten czasownik nie zezwalał na czasownik.

Ostatnim razem, gdy miałem ten sam problem w usługach IIS innego serwera, wynikało to z braku znaku „/” na końcu adresu URL, ponieważ prawdopodobnie korzystał z domyślnego programu obsługi bez użycia domyślnego dokumentu, a teraz zdaję sobie z tego sprawę ... więc sprawdź IIS mapowania obsługi, jeśli nic innego nie pomoże.

Harish
źródło
2

Miałem ten problem, ale nie było nic związanego z WebDAV. W moim przypadku klient wysyłał POST do www.myServer.com/api/chart. To wywołanie powinno być obsługiwane przez „ExtensionlessUrlHanlder-Integrated-4.0”, jednak w jakiś sposób lokalna struktura plików została utworzona w katalogu mojego serwera „... \ Server \ api \ chart \”. Oznaczało to, że zamiast tego wywoływano procedurę obsługi „StaticFile”. Usunięcie tych plików lokalnych ostatecznie rozwiązało problem.

Atilio Jobson
źródło
2

Oto, co zadziałało dla mnie:

Otwórz IIS i kliknij swoją witrynę.

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.

nPcomp
źródło
1

W przypadku serwera Windows 2012 -> Przejdź do Menedżera serwera -> Usuń role i funkcje -> Role serwera -> Serwer sieci Web (IIS) -> Serwer sieci Web -> Typowe funkcje HTTP -> Odznacz publikowanie WebDAV i usuń -> Uruchom ponownie serwer.

Savan Gadhiya
źródło
0

Jeśli pula aplikacji usług IIS działa w trybie klasycznym, upewnij się, że plik web.config zawiera następujące elementy

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
Arjun Mukherji
źródło
0

W moim przypadku przeniosłem Web Deploy na inny port, który był również portem IIS (nie 80). Na początku nie zdawałem sobie sprawy, ale mimo że nie było błędów działających na obu na tym samym porcie, wydaje się, że Web Deploy najprawdopodobniej z jakiegoś powodu odpowiadało jako pierwsze zamiast usług IIS, powodując ten błąd. Właśnie przeniosłem moje powiązanie IIS do innego portu i wszystko jest w porządku. ;)

James Wilkins
źródło
0

Aby w ogóle uniemożliwić włączenie WebDav, usuń następujący wpis z ApplicationHost.config: <add name="WebDAVModule" />

Wpis znajduje się w sekcji modułów.

Dokładna lokalizacja konfiguracji: C:\Windows\System32\inetsrv\config\applicationHost.config

Yush0
źródło
0

Miałem ten sam problem, z RESTful API działającym na rdzeniu aspnet.

Nie chciałem odinstalować WebDAV i wypróbowałem większość opisanych powyżej środków zaradczych. Próbowałem ustawić czasowniki = "*" zarówno na stronie, jak i na samym serwerze, ale bez powodzenia.

Jaka sztuczka była dla mnie następująca:

Menedżer usług IIS -> Witryny -> MySite -> HandlerMappings -> aspNetCore -> Edytuj

-> Żądaj ograniczeń -> Dostęp -> Brak (to był skrypt).

Potem wszystko działało, nawet jeśli wymieniłem oryginalne opcje WebDAV.

Dardan Vokshi
źródło