Rozwiązywanie problemów z aplikacjami internetowego interfejsu API2, które działają w programie Visual Studio i kończą się niepowodzeniem na produkcyjnym serwerze usług IIS

W tym lekcji wyjaśniono, jak rozwiązywać problemy z aplikacjami internetowego interfejsu API2 wdrożonych na produkcyjnym serwerze usług IIS. Dotyczy to typowych błędów HTTP 405 i 501.

Oprogramowanie używane w tym samouczku

Aplikacje internetowego interfejsu API zwykle używają kilku czasowników HTTP: GET, POST, PUT, DELETE i czasami PATCH. Oznacza to, że deweloperzy mogą napotkać sytuacje, w których te czasowniki są implementowane przez inny moduł usług IIS na ich produkcyjnym serwerze IIS, co prowadzi do sytuacji, w której kontroler internetowego interfejsu API, który działa prawidłowo w programie Visual Studio lub na serwerze deweloperskim zwróci błąd HTTP 405 podczas wdrażania na produkcyjnym serwerze USŁUG IIS.

Co powoduje błędy HTTP 405

Pierwszym krokiem w kierunku uczenia się, jak rozwiązywać problemy z błędami HTTP 405, jest zrozumienie, co faktycznie oznacza błąd HTTP 405. Podstawowym dokumentem zarządzającym dla protokołu HTTP jest RFC 2616, który definiuje kod stanu HTTP 405 jako Niedozwolony, a następnie opisuje ten kod stanu jako sytuację, w której "metoda określona w Request-Line nie jest dozwolona dla zasobu zidentyfikowanego przez identyfikator URI żądania". Innymi słowy czasownik HTTP nie jest dozwolony dla określonego adresu URL żądanego przez klienta HTTP.

Poniżej przedstawiono kilka najczęściej używanych metod HTTP zdefiniowanych w dokumencie RFC 2616, RFC 4918 i RFC 5789:

HTTP, metoda Opis
GET Ta metoda służy do pobierania danych z identyfikatora URI i prawdopodobnie najczęściej używanej metody HTTP.
HEAD Ta metoda jest podobna do metody GET, z tą różnicą, że w rzeczywistości nie pobiera danych z identyfikatora URI żądania — po prostu pobiera stan HTTP.
POST Ta metoda jest zwykle używana do wysyłania nowych danych do identyfikatora URI; Funkcja POST jest często używana do przesyłania danych formularza.
PUT Ta metoda jest zwykle używana do wysyłania nieprzetworzonych danych do identyfikatora URI; Funkcja PUT jest często używana do przesyłania danych JSON lub XML do aplikacji internetowego interfejsu API.
DELETE Ta metoda służy do usuwania danych z identyfikatora URI.
OPTIONS Ta metoda jest zwykle używana do pobierania listy metod HTTP obsługiwanych dla identyfikatora URI.
KOPIOWANIE PRZENOSZENIA Te dwie metody są używane z webDAV, a ich celem jest objaśnienia.
MKCOL Ta metoda jest używana z funkcją WebDAV i służy do tworzenia kolekcji (np. katalogu) w określonym identyfikatorze URI.
PROPFIND PROPPATCH Te dwie metody są używane z funkcją WebDAV i służą do wykonywania zapytań lub ustawiania właściwości identyfikatora URI.
BLOKADA ODBLOKOWYWANIA Te dwie metody są używane z funkcją WebDAV i służą do blokowania/odblokowywania zasobu zidentyfikowanych przez identyfikator URI żądania podczas tworzenia.
PATCH Ta metoda służy do modyfikowania istniejącego zasobu HTTP.

Gdy jedna z tych metod HTTP jest skonfigurowana do użycia na serwerze, serwer będzie odpowiadać ze stanem HTTP i innymi danymi, które są odpowiednie dla żądania. (Na przykład metoda GET może otrzymać odpowiedź HTTP 200 OK , a metoda PUT może otrzymać utworzoną odpowiedź HTTP 201).

Jeśli metoda HTTP nie jest skonfigurowana do użycia na serwerze, serwer odpowie przy użyciu błędu HTTP 501 Nie zaimplementowano .

Jednak jeśli metoda HTTP jest skonfigurowana do użycia na serwerze, ale została wyłączona dla danego identyfikatora URI, serwer odpowie przy użyciu błędu Niedozwolona metoda HTTP 405.

Przykładowy błąd HTTP 405

Poniższy przykładowe żądanie HTTP i odpowiedź ilustrują sytuację, w której klient HTTP próbuje umieścić wartość w aplikacji internetowego interfejsu API na serwerze internetowym, a serwer zwraca błąd HTTP, który stwierdza, że metoda PUT jest niedozwolona:

Żądanie HTTP:

PUT /api/values/1 HTTP/1.1
Content-type: application/json
Host: localhost
Accept: */*
Content-Length: 12

"Some Value"

Odpowiedź HTTP:

HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Wed, 15 May 2013 02:38:57 GMT
Content-Length: 72

{"Message":"The requested resource does not support http method 'PUT'."}

W tym przykładzie klient HTTP wysłał prawidłowe żądanie JSON do adresu URL aplikacji internetowego interfejsu API na serwerze sieci Web, ale serwer zwrócił komunikat o błędzie HTTP 405, który wskazuje, że metoda PUT nie była dozwolona dla adresu URL. Jeśli natomiast identyfikator URI żądania nie pasuje do trasy dla aplikacji internetowego interfejsu API, serwer zwróci błąd HTTP 404 Nie znaleziono .

Rozwiązywanie problemów z błędami HTTP 405

Istnieje kilka powodów, dla których określone zlecenie HTTP może nie być dozwolone, ale istnieje jeden podstawowy scenariusz, który jest główną przyczyną tego błędu w usługach IIS: wiele procedur obsługi jest zdefiniowanych dla tego samego czasownika/metody, a jeden z procedur obsługi blokuje oczekiwaną procedurę obsługi przetwarzania żądania. W celu wyjaśnienia programy obsługi usług IIS przetwarza programy obsługi od pierwszego do ostatniego na podstawie wpisów programu obsługi zamówień w plikach applicationHost.config i web.config , gdzie pierwsza zgodna kombinacja ścieżki, czasownika, zasobu itp. będzie używana do obsługi żądania.

Poniższy przykład to fragment pliku applicationHost.config dla serwera usług IIS, który zwrócił błąd HTTP 405 podczas używania metody PUT do przesyłania danych do aplikacji internetowego interfejsu API. W tym fragmancie zdefiniowano kilka procedur obsługi HTTP, a każda procedura obsługi ma inny zestaw metod HTTP, dla których jest skonfigurowany — ostatni wpis na liście to program obsługi zawartości statycznej, który jest domyślnym procedurą obsługi, która jest używana po tym, jak inne programy obsługi miały szansę zbadać żądanie:

<handlers accessPolicy="Read, Script">
   <add name="WebDAV"
      path="*"
      verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
      modules="WebDAVModule"
      resourceType="Unspecified"
      requireAccess="None" />
   <add name="ISAPI-dll"
      path="*.dll"
      verb="*"
      modules="IsapiModule"
      resourceType="File"
      requireAccess="Execute"
      allowPathInfo="true" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
      path="*."
      verb="GET,HEAD,POST,DEBUG"
      modules="IsapiModule"
      scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness64"
      responseBufferLimit="0" />

   <!-- Additional handlers will be defined here. -->

   <add name="StaticFile"
      path="*"
      verb="*"
      modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
      resourceType="Either"
      requireAccess="Read" />
</handlers>

W poprzednim przykładzie program obsługi WebDAV i program obsługi adresów URL bez rozszerzenia dla ASP.NET (który jest używany dla internetowego interfejsu API) są wyraźnie zdefiniowane dla oddzielnych list metod HTTP. Należy pamiętać, że procedura obsługi bibliotek DLL ISAPI jest skonfigurowana dla wszystkich metod HTTP, chociaż ta konfiguracja nie musi powodować błędu. Jednak podczas rozwiązywania problemów z błędami HTTP 405 należy wziąć pod uwagę ustawienia konfiguracji, takie jak te.

W poprzednim przykładzie procedura obsługi bibliotek DLL ISAPI nie była problemem; w rzeczywistości problem nie został zdefiniowany w pliku applicationHost.config serwera usług IIS — problem został spowodowany wpisem, który został utworzony w pliku web.config podczas tworzenia aplikacji internetowego interfejsu API w programie Visual Studio. Poniższy fragment pliku web.config aplikacji pokazuje lokalizację problemu:

<handlers accessPolicy="Read, Script">
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <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" />
</handlers>

W tym fragmancie program obsługi adresów URL bez rozszerzenia dla ASP.NET zostanie ponownie zdefiniowany, aby uwzględnić dodatkowe metody HTTP, które będą używane z aplikacją internetowego interfejsu API. Jednak ponieważ podobny zestaw metod HTTP jest definiowany dla programu obsługi WebDAV, występuje konflikt. W tym konkretnym przypadku program obsługi WebDAV jest definiowany i ładowany przez usługi IIS, mimo że funkcja WebDAV jest wyłączona dla witryny internetowej zawierającej aplikację internetowego interfejsu API. Podczas przetwarzania żądania HTTP PUT usługi IIS wywołuje moduł WebDAV, ponieważ jest on zdefiniowany dla czasownika PUT. Po wywołaniu modułu WebDAV sprawdza jego konfigurację i widzi, że jest ona wyłączona, dlatego zwróci błąd HTTP 405 Method Not Allowed (Niedozwolona metoda HTTP 405) dla dowolnego żądania przypominającego żądanie WebDAV. Aby rozwiązać ten problem, należy usunąć aplikację WebDAV z listy modułów HTTP dla witryny internetowej, w której zdefiniowano aplikację internetowego interfejsu API. W poniższym przykładzie pokazano, jak to może wyglądać:

<handlers accessPolicy="Read, Script">
   <remove name="WebDAV" />
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <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" />
</handlers>

Ten scenariusz jest często spotykany po opublikowaniu aplikacji ze środowiska deweloperskiego do środowiska produkcyjnego usług IIS. Dzieje się tak, ponieważ lista programów obsługi/modułów różni się między środowiskami deweloperskimi i produkcyjnymi. Jeśli na przykład używasz programu Visual Studio 2012 lub nowszego do tworzenia aplikacji internetowego interfejsu API, IIS Express jest domyślnym serwerem internetowym do testowania. Ten programowy serwer internetowy jest skalowaną w dół wersją pełnej funkcjonalności usług IIS dostarczanych w produkcie serwera, a ten programowy serwer internetowy zawiera kilka zmian, które zostały dodane do scenariuszy programowania. Na przykład moduł WebDAV jest często instalowany na produkcyjnym serwerze internetowym z pełną wersją usług IIS, chociaż może nie być używany. Wersja programowa usług IIS (IIS Express) instaluje moduł WebDAV, ale wpisy modułu WebDAV są celowo komentowane, więc moduł WebDAV nigdy nie jest ładowany na IIS Express, chyba że w szczególności zmienisz ustawienia konfiguracji IIS Express w celu dodania funkcji WebDAV do instalacji IIS Express. W związku z tym aplikacja internetowa może działać poprawnie na komputerze deweloperskim, ale podczas publikowania aplikacji internetowego interfejsu API sieci Web na produkcyjnym serwerze sieci Web usług IIS mogą wystąpić błędy HTTP 405.

Błędy HTTP 501

  • Wskazuje, że na serwerze nie zaimplementowano określonej funkcjonalności.
  • Zazwyczaj oznacza, że w ustawieniach usług IIS nie ma zdefiniowanej procedury obsługi zgodnej z żądaniem HTTP:
    • Prawdopodobnie wskazuje, że coś nie zostało poprawnie zainstalowane w usługach IIS lub
    • Coś zmodyfikowało ustawienia usług IIS, aby nie zdefiniowano procedur obsługi, które obsługują określoną metodę HTTP.

Aby rozwiązać ten problem, należy ponownie zainstalować każdą aplikację, która próbuje użyć metody HTTP, dla której nie ma odpowiednich definicji modułu ani programu obsługi.

Podsumowanie

Błędy HTTP 405 są spowodowane tym, że metoda HTTP nie jest dozwolona przez serwer internetowy dla żądanego adresu URL. Ten warunek jest często wyświetlany, gdy określona procedura obsługi została zdefiniowana dla określonego zlecenia, a procedura obsługi zastępuje procedurę obsługi, której oczekujesz przetworzenia żądania.