Řešení potíží s aplikacemi Web API2, které fungují v sadě Visual Studio a selhávají na produkčním serveru SLUŽBY IIS

Tato dokumentace vysvětluje, jak řešit potíže s aplikacemi Web API2, které jsou nasazené na produkčním serveru SLUŽBY IIS. Řeší běžné chyby HTTP 405 a 501.

Software použitý v tomto kurzu

Aplikace webového rozhraní API obvykle používají několik příkazů HTTP: GET, POST, PUT, DELETE a někdy PATCH. Vývojáři ale můžou narazit na situace, kdy jsou tyto příkazy implementované jiným modulem služby IIS na produkčním serveru IIS, což vede k situaci, kdy kontroler webového rozhraní API, který funguje správně v sadě Visual Studio nebo na vývojovém serveru, vrátí chybu HTTP 405, když je nasazen na produkční server služby IIS.

Co způsobuje chyby HTTP 405

Prvním krokem k tomu, abyste se dozvěděli, jak řešit chyby HTTP 405, je pochopit, co chyba HTTP 405 ve skutečnosti znamená. Primárním řídícím dokumentem pro HTTP je dokument RFC 2616, který definuje stavový kód HTTP 405 jako metodu nepovolenou a dále popisuje tento stavový kód jako situaci, kdy metoda zadaná v Request-Line není povolená pro prostředek identifikovaný identifikátorem Request-URI. Jinými slovy, příkaz HTTP není povolen pro konkrétní adresu URL, kterou klient HTTP požadoval.

Tady je několik nejčastěji používaných metod HTTP definovaných v RFC 2616, RFC 4918 a RFC 5789:

Metoda HTTP Description
GET Tato metoda se používá k načtení dat z identifikátoru URI a pravděpodobně se jedná o nejčastěji používanou metodu HTTP.
HEAD Tato metoda se hodně podobá metodě GET s tím rozdílem, že ve skutečnosti nenačítá data z identifikátoru URI požadavku – jednoduše načte stav HTTP.
POST Tato metoda se obvykle používá k odesílání nových dat do identifikátoru URI; Post se často používá k odesílání dat formuláře.
PUT Tato metoda se obvykle používá k odesílání nezpracovaných dat do identifikátoru URI; PUT se často používá k odesílání dat JSON nebo XML do aplikací webového rozhraní API.
DELETE Tato metoda se používá k odebrání dat z identifikátoru URI.
OPTIONS Tato metoda se obvykle používá k načtení seznamu metod HTTP, které jsou podporovány pro identifikátor URI.
ZKOPÍROVÁNÍ PŘESUNUTÍ Tyto dvě metody se používají s protokolem WebDAV a jejich účel je vysvětlující.
MKCOL Tato metoda se používá s protokolem WebDAV a slouží k vytvoření kolekce (např. adresáře) se zadaným identifikátorem URI.
PROPFIND PROPPATCH Tyto dvě metody se používají s protokolem WebDAV a slouží k dotazování nebo nastavení vlastností identifikátoru URI.
UZAMKNOUT ODEMKNOUT Tyto dvě metody se používají s protokolem WebDAV a slouží k uzamčení/odemknutí prostředku identifikovaného identifikátorem URI požadavku při vytváření.
PATCH Tato metoda se používá k úpravě existujícího prostředku HTTP.

Když je jedna z těchto metod HTTP nakonfigurovaná pro použití na serveru, server odpoví stavem HTTP a dalšími daty, která jsou pro požadavek vhodná. (Například metoda GET může obdržet odpověď HTTP 200 OK a metoda PUT může obdržet vytvořenou odpověď HTTP 201.)

Pokud metoda HTTP není nakonfigurovaná pro použití na serveru, server odpoví chybou HTTP 501 Není implementováno .

Pokud je však metoda HTTP nakonfigurovaná pro použití na serveru, ale pro daný identifikátor URI je zakázaná, server odpoví chybou HTTP 405 – Metoda není povolena .

Příklad chyby HTTP 405

Následující příklad požadavku a odpovědi HTTP ilustruje situaci, kdy se klient HTTP pokouší vložit hodnotu do aplikace webového rozhraní API na webovém serveru a server vrátí chybu HTTP, která uvádí, že metoda PUT není povolená:

Požadavek HTTP:

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

"Some Value"

Odpověď 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'."}

V tomto příkladu odeslal klient HTTP platný požadavek JSON na adresu URL pro aplikaci webového rozhraní API na webovém serveru, ale server vrátil chybovou zprávu HTTP 405, která značí, že metoda PUT nebyla pro adresu URL povolená. Naproti tomu pokud identifikátor URI požadavku neodpovídá trase pro aplikaci webového rozhraní API, server vrátí chybu HTTP 404 Nenalezena .

Řešení chyb HTTP 405

Existuje několik důvodů, proč konkrétní příkaz HTTP nemusí být povolen, ale existuje jeden primární scénář, který je hlavní příčinou této chyby ve službě IIS: více obslužných rutin je definováno pro stejnou operaci nebo metodu a jedna z obslužných rutin blokuje očekávanou obslužnou rutinu ve zpracování požadavku. Služba IIS zpracovává obslužné rutiny od prvního do posledního na základě položek obslužné rutiny pořadí v applicationHost.config a web.config souborech, kde se ke zpracování požadavku použije první odpovídající kombinace cesty, slovesa, prostředku atd.

Následující příklad je výňatek ze souboru applicationHost.config pro server služby IIS, který vracel chybu HTTP 405 při použití metody PUT k odeslání dat do aplikace webového rozhraní API. V tomto výňatku je definováno několik obslužných rutin HTTP a každá obslužná rutina má jinou sadu metod HTTP, pro které je nakonfigurovaná – poslední položkou v seznamu je obslužná rutina statického obsahu, což je výchozí obslužná rutina, která se použije poté, co ostatní obslužné rutiny měly možnost požadavek prozkoumat:

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

V předchozím příkladu jsou obslužná rutina WebDAV a obslužná rutina adresy URL bez rozšíření pro ASP.NET (která se používá pro webové rozhraní API) jasně definované pro samostatné seznamy metod HTTP. Mějte na paměti, že obslužná rutina KNIHOVNY ISAPI DLL je nakonfigurovaná pro všechny metody HTTP, i když tato konfigurace nemusí nutně způsobit chybu. Při řešení chyb HTTP 405 je ale potřeba vzít v úvahu nastavení konfigurace, jako je toto.

V předchozím příkladu nebyla problémem obslužná rutina ISAPI DLL; ve skutečnosti nebyl problém definován v souboruapplicationHost.config pro server služby IIS – problém byl způsoben záznamem, který byl proveden v souboruweb.config při vytvoření aplikace webového rozhraní API v sadě Visual Studio. Následující výňatek ze souboru web.config aplikace ukazuje umístění problému:

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

V tomto výňatku je obslužná rutina adresy URL bez rozšíření pro ASP.NET předefinována tak, aby zahrnovala další metody HTTP, které se budou používat s aplikací webového rozhraní API. Vzhledem k tomu, že podobná sada metod HTTP je definována pro obslužnou rutinu WebDAV, dojde ke konfliktu. V tomto konkrétním případě je obslužná rutina Protokolu WebDAV definovaná a načtená službou IIS, i když je protokol WebDAV pro web, který obsahuje aplikaci webového rozhraní API, zakázaný. Během zpracování požadavku HTTP PUT služba IIS volá modul WebDAV, protože je definován pro příkaz PUT. Při zavolání modulu WebDAV zkontroluje jeho konfiguraci a zjistí, že je zakázaný, takže vrátí chybu HTTP 405 Method Not Allowed (Metoda HTTP 405 není povolena) pro všechny požadavky, které se podobají požadavku Protokolu WebDAV. Pokud chcete tento problém vyřešit, měli byste odebrat protokol WebDAV ze seznamu modulů HTTP pro web, na kterém je definovaná vaše aplikace webového rozhraní API. Následující příklad ukazuje, jak to může vypadat:

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

K tomuto scénáři často dochází po publikování aplikace z vývojového prostředí do produkčního prostředí služby IIS, a to proto, že seznam obslužných rutin a modulů se liší mezi vývojovým a produkčním prostředím. Pokud například k vývoji aplikace webového rozhraní API používáte Visual Studio 2012 nebo novější, IIS Express je výchozím webovým serverem pro testování. Tento vývojový webový server je škálovanou verzí všech funkcí služby IIS, které jsou součástí serverového produktu, a tento vývojový webový server obsahuje několik změn, které byly přidány pro vývojové scénáře. Například modul WebDAV se často instaluje na produkční webový server, na kterém běží plná verze služby IIS, i když se nemusí používat. Vývojová verze služby IIS (IIS Express) nainstaluje modul WebDAV, ale položky pro modul WebDAV jsou záměrně zakomentovány, takže modul WebDAV se nikdy nenačte na IIS Express, pokud výslovně nezměníte nastavení konfigurace IIS Express přidáním funkce Protokolu WebDAV do instalace IIS Express. V důsledku toho může webová aplikace správně fungovat na vašem vývojovém počítači, ale při publikování aplikace webového rozhraní API na produkční webový server služby IIS může dojít k chybám HTTP 405.

Chyby HTTP 501

  • Označuje, že konkrétní funkce nebyly na serveru implementovány.
  • Obvykle to znamená, že v nastavení služby IIS není definovaná žádná obslužná rutina, která odpovídá požadavku HTTP:
    • Pravděpodobně značí, že něco nebylo správně nainstalováno ve službě IIS nebo
    • Něco změnilo nastavení služby IIS tak, aby nebyly definovány žádné obslužné rutiny, které podporují konkrétní metodu HTTP.

Pokud chcete tento problém vyřešit, budete muset přeinstalovat každou aplikaci, která se pokouší použít metodu HTTP, pro kterou nemá odpovídající definice modulu nebo obslužné rutiny.

Souhrn

Chyby HTTP 405 jsou způsobeny, když webový server nepovoluje metodu HTTP pro požadovanou adresu URL. Tato podmínka se často zobrazuje, když je pro konkrétní příkaz definována konkrétní obslužná rutina a tato obslužná rutina přepisuje obslužnou rutinu, u které očekáváte zpracování požadavku.