Řešení potíží s aplikacemi Web API2, které fungují v sadě Visual Studio, ale nefungují na produkčním serveru IIS.

Tento dokument vysvětluje, jak řešit potíže s aplikacemi webového rozhraní API2 nasazenými na produkční server 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. To znamená, že vývojáři můžou narazit na situace, kdy jsou tyto příkazy implementovány jiným modulem IIS na svém produkčním serveru IIS, což vede k situaci, kdy řadič 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 IIS.

Co způsobuje chyby HTTP 405

Prvním krokem ke zjištění, jak řešit chyby HTTP 405, je pochopit, co skutečně znamená chyba HTTP 405. Primární dokument pro řízení pro HTTP je RFC 2616, který definuje stavový kód HTTP 405 jako metodu Není povoleno, a dále popisuje tento stavový kód jako situaci, kdy metoda zadaná v Request-Line není povolena 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.

Stručně si projděte několik nejčastěji používaných metod HTTP definovaných v DOKUMENTU 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 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 na URI; POST se často používá k předává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 slouží k odebrání dat z identifikátoru URI.
MOŽNOSTI Tato metoda se obvykle používá k načtení seznamu metod HTTP, které jsou podporovány pro identifikátor URI.
KOPÍROVAT PŘESUNOUT Tyto dvě metody se používají s protokolem WebDAV a jejich účel je zřejmý sám o sobě.
MKCOL Tato metoda se používá s protokolem WebDAV a slouží k vytvoření kolekce (např. adresáře) na zadaném identifikátoru URI.
PROPFIND PROPPATCH Tyto dvě metody se používají s protokolem WebDAV a slouží k dotazování nebo nastavení vlastností identifikátoru URI.
ODEMKNOUT ZÁMEK Tyto dvě metody se používají s protokolem WebDAV a používají se k uzamčení nebo 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.

Pokud 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 není metoda HTTP 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 byla zakázaná, server odpoví chybou HTTP 405 Metoda Není povolena .

Příklad chyby HTTP 405

Následující příklad požadavku HTTP a odpovědi ilustrují 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 klient HTTP odeslal 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 povolena. 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: pro stejnou operaci nebo metodu je definováno více obslužných rutin a jeden z obslužných rutin blokuje očekávanou obslužnou rutinu při zpracování požadavku. Vysvětlujeme, že IIS zpracovává handlery od prvního do posledního na základě pořadí modulů v souborech applicationHost.config a web.config, kde se k 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ý při použití metody PUT k odeslání dat do aplikace webového rozhraní API vrátil chybu HTTP 405. 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žka v seznamu je obslužná rutina statického obsahu, což je výchozí obslužná rutina, která se používá poté, co ostatní obslužné rutiny mají šanci prozkoumat požadavek:

<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ě definovány pro samostatné seznamy metod HTTP. Všimněte si, že obslužná rutina knihovny DLL ISAPI je nakonfigurována pro všechny metody HTTP, i když tato konfigurace nemusí nutně způsobit chybu. Při řešení potíží s chybami HTTP 405 je však potřeba zvážit nastavení konfigurace, jako je tato.

V předchozím příkladu nebyla obslužná rutina knihovny DLL ISAPI problém; ve skutečnosti nebyl problém definován v souboru applicationHost.config pro server IIS – problém byl způsoben položkou, která byla provedena v souboru web.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 znovu definována tak, aby zahrnovala další metody HTTP, které se použijí s aplikací webového rozhraní API. Vzhledem k tomu, že pro obslužnou rutinu Protokolu WebDAV je definována podobná sada metod HTTP, dojde ke konfliktu. V tomto konkrétním případě je obslužná rutina WebDAV definována a načtena službou IIS, i když je pro web zakázaný protokol WebDAV, který obsahuje aplikaci webového rozhraní API. 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 Metoda Not Allowed pro všechny požadavky, které se podobají požadavku WebDAV. Pokud chcete tento problém vyřešit, měli byste webDAV odebrat ze seznamu modulů HTTP pro web, na kterém je definována aplikace webového rozhraní API. Následující příklad ukazuje, jak by to mohlo 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>

Tento scénář se často vyskytuje po publikování aplikace z vývojového prostředí do produkčního prostředí služby IIS a k tomu dochází, protože seznam obslužných rutin a modulů se mezi vývojovým a produkčním prostředím liší. Pokud například k vývoji aplikace webového rozhraní API používáte Visual Studio 2012 nebo novější, je služba IIS Express výchozím webovým serverem pro testování. Tento vývojový webový server je škálovaná verze úplné funkčnosti služby IIS, která se dodává v serverovém 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 modulu WebDAV jsou záměrně zakomentovány, takže modul WebDAV se nikdy nenačte ve službě IIS Express, pokud výslovně nezměníte nastavení konfigurace služby IIS Express a přidáte do instalace služby IIS Express funkci Protokolu WebDAV. V důsledku toho může webová aplikace správně fungovat na vývojovém počítači, ale při publikování aplikace webového rozhraní API do produkčního webového serveru IIS může dojít k chybám HTTP 405.

chyby HTTP 501

  • Označuje, že na serveru nebyla implementována konkrétní funkce.
  • 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 se něco nenainstalovalo správně 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 jakoukoli aplikaci, která se pokouší použít metodu HTTP, pro kterou nemá žádné odpovídající definice modulu nebo obslužné rutiny.

Shrnutí

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