Устранение неполадок приложений web API2, работающих в Visual Studio и завершающихся сбоем на рабочем сервере IIS

В этом документе объясняется, как устранять неполадки приложений web API2, развернутых на рабочем сервере IIS. Он устраняет распространенные ошибки HTTP 405 и 501.

Программное обеспечение, используемое в этом руководстве

Приложения веб-API обычно используют несколько HTTP-команд: GET, POST, PUT, DELETE, а иногда PATCH. При этом разработчики могут столкнуться с ситуациями, когда эти команды реализуются другим модулем IIS на рабочем сервере IIS, что приводит к ситуации, когда контроллер веб-API, который правильно работает в Visual Studio или на сервере разработки, возвращает ошибку HTTP 405 при развертывании на рабочем сервере IIS.

Причины ошибок HTTP 405

Первым шагом к изучению способа устранения ошибок HTTP 405 является понимание того, что на самом деле означает ошибка HTTP 405. Основным руководящим документом для HTTP является RFC 2616, который определяет код состояния HTTP 405 как метод Not Allowed и далее описывает этот код состояния как ситуацию, когда "метод, указанный в Request-Line, не разрешен для ресурса, определенного с помощью URI запроса". Другими словами, http-команда не допускается для конкретного URL-адреса, запрошенного КЛИЕНТом HTTP.

В качестве краткого обзора ниже приведены некоторые наиболее часто используемые методы HTTP, определенные в RFC 2616, RFC 4918 и RFC 5789:

Метод HTTP Описание
GET Этот метод используется для получения данных из URI и, вероятно, является наиболее используемым методом HTTP.
HEAD Этот метод во многом похож на метод GET, за исключением того, что он фактически не извлекает данные из URI запроса, а просто извлекает состояние HTTP.
POST Этот метод обычно используется для отправки новых данных в URI; POST часто используется для отправки данных формы.
PUT Этот метод обычно используется для отправки необработанных данных в URI; PUT часто используется для отправки данных JSON или XML в приложения веб-API.
DELETE Этот метод используется для удаления данных из URI.
OPTIONS Этот метод обычно используется для получения списка методов HTTP, поддерживаемых для URI.
COPY MOVE Эти два метода используются с WebDAV, и их назначение является понятным.
MKCOL Этот метод используется с WebDAV и используется для создания коллекции (например, каталога) по указанному универсальному коду ресурса (URI).
PROPFIND PROPPATCH Эти два метода используются с WebDAV и используются для запроса или задания свойств для универсального кода ресурса (URI).
БЛОКИРОВКА РАЗБЛОКИРОВКИ Эти два метода используются с WebDAV и используются для блокировки или разблокировки ресурса, определяемого URI запроса при разработке.
PATCH Этот метод используется для изменения существующего ресурса HTTP.

Если один из этих методов HTTP настроен для использования на сервере, сервер ответит состоянием HTTP и другими данными, соответствующими запросу. (Например, метод GET может получить ответ HTTP 200 OK , а метод PUT может получить ответ HTTP 201 Created .)

Если метод HTTP не настроен для использования на сервере, сервер ответит ошибкой HTTP 501 Не реализовано .

Однако если метод HTTP настроен для использования на сервере, но он отключен для заданного URI, сервер ответит ошибкой HTTP 405 Method Not Allowed .

Пример ошибки HTTP 405

В следующем примере HTTP-запроса и ответа показана ситуация, когда HTTP-клиент пытается получить значение PUT в приложении веб-API на веб-сервере, а сервер возвращает ошибку HTTP, в которой указано, что метод PUT не разрешен:

HTTP-запрос:

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

"Some Value"

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

В этом примере HTTP-клиент отправил действительный запрос JSON на URL-адрес приложения веб-API на веб-сервере, но сервер вернул сообщение об ошибке HTTP 405, указывающее, что метод PUT не разрешен для URL-адреса. В отличие от этого, если URI запроса не соответствует маршруту для приложения веб-API, сервер вернет ошибку HTTP 404 Не найдено .

Устранение ошибок HTTP 405

Существует несколько причин, по которым определенная HTTP-команда может быть запрещена, но существует один основной сценарий, который является основной причиной этой ошибки в IIS: для одной и той же команды или метода определено несколько обработчиков, а один из обработчиков блокирует обработку запроса ожидаемым обработчиком. В качестве объяснения iis обрабатывает обработчики от первого до последнего на основе записей обработчика заказов в файлахapplicationHost.config и web.config , где для обработки запроса будет использоваться первая соответствующая комбинация пути, команды, ресурса и т. д.

В следующем примере приведен фрагмент файла applicationHost.config для сервера IIS, возвращающего ошибку HTTP 405 при использовании метода PUT для отправки данных в приложение веб-API. В этом фрагменте определено несколько обработчиков HTTP, и каждый обработчик имеет свой набор методов HTTP, для которых он настроен. Последней записью в списке является обработчик статического содержимого, который является обработчиком по умолчанию, который используется после того, как другие обработчики имели возможность проверить запрос:

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

В предыдущем примере обработчик WebDAV и обработчик URL-адресов без расширения для ASP.NET (который используется для веб-API) четко определены для отдельных списков методов HTTP. Обратите внимание, что обработчик DLL ISAPI настроен для всех методов HTTP, хотя эта конфигурация не обязательно приведет к ошибке. Однако при устранении ошибок HTTP 405 необходимо учитывать такие параметры конфигурации.

В предыдущем примере обработчик БИБЛИОТЕКи ISAPI не был проблемой. на самом деле проблема не была определена в файлеapplicationHost.config для сервера IIS. Проблема была вызвана записью, которая была сделана в файлеweb.config при создании приложения веб-API в Visual Studio. В следующем фрагменте из файлаweb.config приложения показано расположение проблемы:

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

В этом фрагменте обработчик URL-адресов без расширения для ASP.NET переопределен, чтобы включить дополнительные методы HTTP, которые будут использоваться с приложением веб-API. Однако, так как для обработчика WebDAV определен аналогичный набор методов HTTP, возникает конфликт. В этом конкретном случае обработчик WebDAV определяется и загружается службами IIS, несмотря на то, что WebDAV отключен для веб-сайта, включающего приложение веб-API. Во время обработки HTTP-запроса PUT iis вызывает модуль WebDAV, так как он определен для команды PUT. При вызове модуля WebDAV он проверяет его конфигурацию и видит, что он отключен, поэтому он возвращает ошибку HTTP 405 Method Not Allowed для любого запроса, похожего на запрос WebDAV. Чтобы устранить эту проблему, необходимо удалить WebDAV из списка http-модулей для веб-сайта, на котором определено приложение веб-API. В следующем примере показано, как это может выглядеть:

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

Этот сценарий часто возникает после публикации приложения из среды разработки в рабочую среду IIS, и это происходит потому, что список обработчиков или модулей отличается в вашей среде разработки и рабочей среде. Например, если вы используете Visual Studio 2012 или более поздней версии для разработки приложения веб-API, IIS Express является веб-сервером по умолчанию для тестирования. Этот веб-сервер разработки является уменьшенной версией всех функций IIS, поставляемых в серверном продукте, и этот веб-сервер разработки содержит несколько изменений, которые были добавлены для сценариев разработки. Например, модуль WebDAV часто устанавливается на рабочем веб-сервере под управлением полной версии IIS, хотя он может и не использоваться. Версия iis для разработки (IIS Express) устанавливает модуль WebDAV, но записи для модуля WebDAV намеренно закомментированы, поэтому модуль WebDAV никогда не загружается в IIS Express, если вы специально не измените параметры конфигурации IIS Express, чтобы добавить функциональные возможности WebDAV в IIS Express установку. В результате веб-приложение может правильно работать на компьютере разработки, но при публикации приложения веб-API на рабочем веб-сервере IIS могут возникнуть ошибки HTTP 405.

Ошибки HTTP 501

  • Указывает, что определенные функциональные возможности не были реализованы на сервере.
  • Обычно это означает, что в параметрах IIS не определен обработчик, соответствующий HTTP-запросу:
    • Вероятно, указывает на то, что что-то установлено неправильно в IIS или
    • Что-то изменило параметры IIS, чтобы не было определенных обработчиков, поддерживающих конкретный метод HTTP.

Чтобы устранить эту проблему, необходимо переустановить любое приложение, которое пытается использовать метод HTTP, для которого у него нет соответствующих определений модуля или обработчика.

Итоги

Ошибки HTTP 405 возникают, когда метод HTTP не разрешен веб-сервером для запрошенного URL-адреса. Это условие часто возникает, когда определенный обработчик определен для определенной команды и этот обработчик переопределяет обработчик, который должен обрабатывать запрос.