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

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

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

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

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

Первый шаг к изучению способов устранения ошибок HTTP 405 состоит в том, чтобы понять, что действительно означает ошибка HTTP 405. Основным управляющим документом для HTTP является RFC 2616, который определяет код состояния HTTP 405 как Недопустимый метод, и далее описывает этот код состояния как ситуацию, когда "метод, указанный в строке запроса, не разрешен для ресурса, определяемого запросом URI." другими словами, команда HTTP не разрешена для конкретного URL-адреса, запрошенного клиентом HTTP.

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

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

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

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

Однако если метод HTTP настроен для использования на сервере, но он был отключен для данного универсального кода ресурса (URI), сервер отправит сообщение об ошибке " метод http 405 не разрешен ".

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

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

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-адресу для приложения Web API на сервере, но сервер вернул сообщение об ошибке HTTP 405, которое указывает на то, что метод размещения не разрешен для URL-адреса. В отличие от этого, если URI запроса не соответствует маршруту для приложения веб-API, сервер возвращал ошибку HTTP 404 не найден .

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

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

Следующий пример является выдержкой из файла ApplicationHost. config для сервера IIS, который ВОЗВРАЩАЛ ошибку HTTP 405 при использовании метода размещения для отправки данных в приложение веб-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, даже если для веб-сайта, включающего приложение веб-API, отключен протокол WebDAV. Во время обработки запроса HTTP-размещения IIS вызывает модуль WebDAV, так как он определен для команды размещения. При вызове модуля WebDAV проверяет его конфигурацию и видит, что он отключен, поэтому он возвращает ошибку "метод HTTP 405 не разрешен " для любого запроса, напоминающего запрос 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-адреса. Это условие часто возникает, когда определенный обработчик определен для определенной команды, и этот обработчик переопределяет обработчик, который ожидает обработки запроса.