Устранение проблем с приложениями Web API2, работающими в Visual Studio и падающими на производственном сервере IIS

В этом документе объясняется, как устранять неполадки с приложениями веб-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 как недопустимый метод, а также описывает этот код состояния как ситуацию, когда "метод, указанный в 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.
КОПИРОВАТЬ И ПЕРЕМЕСТИТЬ Эти два метода используются с 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 Not Implemented .

Однако, если метод HTTP настроен для использования на сервере, но он был отключен для заданного URI, сервер будет отвечать с ошибкой HTTP 405 Метод 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 Not Found .

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

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

В следующем примере представлен фрагмент из файла 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 необходимо учитывать такие параметры конфигурации.

В предыдущем примере обработчик DLL 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 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-адреса. Это условие часто возникает при определении определенного обработчика для определенной команды, и этот обработчик переопределяет обработчик, который ожидается обработать запрос.