Rozwiązywanie problemów z aplikacjami sieci Web API2 działających w programie Visual Studio i niepowodzeniem na produkcyjnym serwerze usług IIS

W tym dokumencie wyjaśniono, jak rozwiązywać problemy z aplikacjami sieci Web API2 wdrożonymi na serwerze produkcyjnym usług IIS. Rozwiązuje ona typowe błędy HTTP 405 i 501.

Oprogramowanie używane w tym samouczku

Aplikacje interfejsu API sieci Web zwykle używają kilku czasowników HTTP: GET, POST, PUT, DELETE i czasami poprawek. W takim przypadku deweloperzy mogą działać w sytuacjach, w których te zlecenia są implementowane przez inny moduł usług IIS na serwerze produkcyjnym usług IIS, który prowadzi do sytuacji, w której kontroler internetowego interfejsu API działa prawidłowo w programie Visual Studio lub na serwerze deweloperskim. Po wdrożeniu na produkcyjnym serwerze usług IIS Zwróć błąd HTTP 405.

Co powoduje błędy HTTP 405

Pierwszy krok w kierunku uczenia się, jak rozwiązywać problemy z błędami HTTP 405, to zrozumienie, co faktycznie oznacza błąd HTTP 405. Podstawowym dokumentem Prezesów dla protokołu HTTP jest RFC 2616, który definiuje kod stanu HTTP 405 jako metodę niedozwolony, a dodatkowo opisuje ten kod stanu jako sytuację, w której "metoda określona w wierszu żądania nie jest dozwolona dla zasobu identyfikowanego przez identyfikator URI żądania." innymi słowy, czasownik HTTP jest niedozwolony dla określonego adresu URL, którego żądał klient HTTP.

Poniżej przedstawiono kilka najbardziej używanych metod HTTP, zgodnie z definicją w dokumencie RFC 2616, RFC 4918 i RFC 5789:

Metoda HTTP Opis
GET Ta metoda służy do pobierania danych z identyfikatora URI i prawdopodobnie najczęściej używana metoda HTTP.
MTP Ta metoda jest podobnie jak Metoda GET, z tą różnicą, że 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. WPIS jest często używany do przesyłania danych formularza.
PUT Ta metoda jest zwykle używana do wysyłania danych pierwotnych do identyfikatora URI; Parametr PUT jest często używany do przesyłania danych JSON lub XML do aplikacji interfejsu API sieci Web.
DELETE Ta metoda służy do usuwania danych z identyfikatora URI.
Opcje Ta metoda jest zwykle używana do pobierania listy metod HTTP, które są obsługiwane przez identyfikator URI.
KOPIUJ PRZENIESIENIE Te dwie metody są używane z protokołem WebDAV, a ich celem nie jest wyjaśnienie.
MKCOL Ta metoda jest używana w połączeniu z protokołem WebDAV i służy do tworzenia kolekcji (np. katalogu) o określonym identyfikatorze URI.
PROPFIND PROPPATCH Te dwie metody są używane z protokołem WebDAV i służą do wykonywania zapytań lub ustawiania właściwości identyfikatora URI.
ODBLOKOWYWANIE BLOKADY Te dwie metody są używane w połączeniu z protokołem WebDAV i służą do blokowania/odblokowywania zasobu identyfikowanego przez identyfikator URI żądania podczas tworzenia.
WYSŁANA Ta metoda służy do modyfikowania istniejącego zasobu HTTP.

Jeśli jedna z tych metod HTTP jest skonfigurowana do użycia na serwerze, serwer odpowie ze stanem HTTP i innymi danymi, które są odpowiednie dla żądania. (Na przykład Metoda GET może odebrać odpowiedź HTTP 200 OK , a metoda Put może odebrać odpowiedź HTTP 201 utworzoną ).

Jeśli metoda HTTP nie jest skonfigurowana do użycia na serwerze, serwer odpowie z błędem zaimplementowanym http 501.

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

Przykład błędu HTTP 405

W poniższym przykładzie żądanie HTTP i odpowiedź ilustrują sytuację, w której klient HTTP próbuje umieścić wartość w aplikacji interfejsu API sieci Web na serwerze sieci Web, a serwer zwraca błąd HTTP, który stwierdza, że metoda PUT nie jest dozwolona:

Żą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 interfejsu API sieci Web na serwerze sieci Web, ale serwer zwrócił komunikat o błędzie HTTP 405, który wskazuje, że metoda PUT była niedozwolona dla adresu URL. Z drugiej strony, jeśli identyfikator URI żądania nie jest zgodny z trasą dla aplikacji interfejsu API sieci Web, serwer zwróci błąd nie znaleziono HTTP 404.

Rozwiązywanie błędów HTTP 405

Istnieje kilka powodów, dla których może nie być dozwolone określone zlecenie HTTP, ale istnieje jeden główny scenariusz, który jest wiodącą przyczyną tego błędu w usługach IIS: wiele programów obsługi jest zdefiniowanych dla tego samego czasownika/metody, a jeden z programów obsługi blokuje oczekiwaną procedurę obsługi przetwarzania żądania. W wyniku wyjaśnienia program IIS przetwarza od początku do ostatniego na podstawie wpisów programu obsługi zamówień w plikach ApplicationHost. config i Web. config , gdzie pierwsza zgodna kombinacja ścieżki, zlecenia, zasobu itp. zostanie użyta do obsłużenia żądania.

Poniższy przykład to fragment z pliku ApplicationHost. config dla serwera IIS, który ZWRÓCIŁ błąd HTTP 405 podczas używania metody PUT do przesyłania danych do aplikacji internetowego interfejsu API. Na tym fragmencie są zdefiniowane kilka obsługi protokołu HTTP, a każdy program obsługi ma inny zestaw metod HTTP, dla których jest skonfigurowany — ostatni wpis na liście to procedura obsługi zawartości statycznej, która jest domyślnym programem obsługi, który jest używany po innych procedurach obsługi Chanc e aby przejrzeć żą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 procedura obsługi WebDAV i obsługa adresów URL bez rozszerzenia dla ASP.NET (który jest używany dla interfejsu API sieci Web) jest jasno zdefiniowana dla oddzielnych list metod HTTP. Należy pamiętać, że program obsługi DLL ISAPI jest skonfigurowany dla wszystkich metod HTTP, chociaż taka konfiguracja niekoniecznie spowoduje wystąpienie błędu. Jednak w przypadku rozwiązywania problemów z błędami HTTP 405 należy wziąć pod uwagę ustawienia konfiguracji, takie jak to konieczne.

W powyższym przykładzie nie wystąpił problem z programem obsługi DLL ISAPI. w rzeczywistości problem nie został zdefiniowany w pliku ApplicationHost. config serwera IIS — problem został spowodowany przez wpis wprowadzony w pliku Web. config podczas tworzenia aplikacji internetowego interfejsu API w programie Visual Studio. Poniższy fragment z pliku Web. config aplikacji przedstawia 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 fragmencie program obsługi adresów URL bez rozszerzeń dla ASP.NET został ponownie zdefiniowany w celu uwzględnienia dodatkowych metod HTTP, które będą używane z aplikacją internetowego interfejsu API. Jednak ponieważ podobny zestaw metod HTTP jest zdefiniowany dla programu obsługi WebDAV, występuje konflikt. W tym konkretnym przypadku program obsługi WebDAV został zdefiniowany i załadowany przez usługi IIS, nawet jeśli protokół WebDAV jest wyłączony dla witryny sieci Web zawierającej aplikację internetowego interfejsu API. Podczas przetwarzania żądania HTTP PUT Usługa IIS wywołuje moduł WebDAV, ponieważ jest on zdefiniowany dla zlecenia PUT. Po wywołaniu modułu WebDAV sprawdza jego konfigurację i zauważa, że jest wyłączony, więc zwróci metodę HTTP 405 niedozwolony błąd dla każdego żądania podobnego do żądania WebDAV. Aby rozwiązać ten problem, należy usunąć WebDAV z listy modułów HTTP dla witryny sieci Web, w której jest zdefiniowana aplikacja internetowego interfejsu API. W poniższym przykładzie pokazano, co może wyglądać następująco:

<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 często występuje po opublikowaniu aplikacji ze środowiska programistycznego w środowisku produkcyjnym usług IIS. jest to spowodowane tym, że lista programów obsługi/modułów jest różna w środowiskach deweloperskich i produkcyjnych. Na przykład, jeśli używasz programu Visual Studio 2012 lub nowszego do tworzenia aplikacji internetowego interfejsu API, IIS Express jest domyślnym serwerem sieci Web na potrzeby testowania. Ten serwer sieci Web jest skalowanej wersji pełnej funkcji usług IIS, która jest dostarczana z produktem serwerowym, a ten serwer deweloperskich sieci Web zawiera kilka zmian, które zostały dodane do scenariuszy programistycznych. Na przykład moduł WebDAV jest często instalowany na produkcyjnym serwerze sieci Web, na którym działa pełna wersja usług IIS, chociaż może nie być w użyciu. Wersja deweloperskia usług IIS (IIS Express) zainstaluje moduł WebDAV, ale wpisy dla modułu WebDAV są celowo oznaczone jako komentarz, więc moduł WebDAV nigdy nie jest ładowany na IIS Express, chyba że użytkownik zmieni konfigurację IIS Express ustawienia umożliwiające dodanie funkcji WebDAV do instalacji IIS Express. W związku z tym aplikacja sieci Web może prawidłowo funkcjonować na komputerze deweloperskim, ale podczas publikowania aplikacji internetowego interfejsu API na serwerze produkcyjnym sieci Web usług IIS mogą wystąpić błędy HTTP 405.

Błędy HTTP 501

  • Wskazuje, że określone funkcje nie zostały zaimplementowane na serwerze.
  • Zazwyczaj oznacza to, że w ustawieniach usług IIS nie ma zdefiniowanej procedury obsługi, która pasuje do żądania HTTP:
    • Prawdopodobnie wskazuje, że coś nie zostało poprawnie zainstalowane w usługach IIS lub
    • Coś zmodyfikowano ustawienia usług IIS tak, aby nie było zdefiniowanych programów obsługi, które obsługują określoną metodę HTTP.

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

Podsumowanie

Błędy HTTP 405 są spowodowane błędami, gdy serwer sieci Web nie zezwala na dostęp do żądanego adresu URL. Ten stan jest często widoczny, gdy określony program obsługi został zdefiniowany dla konkretnego zlecenia, a program obsługi zastępują procedurę obsługi, która oczekuje na przetworzenie żądania.