Asp.NET Web API-405 - http глагол, используемый для доступа к этой странице, не разрешен - как установить сопоставления обработчиков


Я написал REST сервис с помощью ASP.NET Web API. Я пытаюсь отправить HttpDelete запрос, однако я получаю следующую ошибку:

405 - http глагол, используемый для доступа к этой странице не допускается

Я думаю, что я близок к решению , я узнал, что я должен включить удаленное управление IIS, перейдите в раздел сопоставления обработчиков и добавьте команду удаления в соответствующую позицию... но проблема в том, что есть много разных позиций в списке... (соматотропный гормон как здесь: http://www.somacon.com/p126.php).

какой из них я должен редактировать? Некоторые из них не имеют расширения, например "ExtensionUrlHandler-Integrated-4.0", и я добавил к нему команду DELETE, но она все еще не работает...

Это был просто выстрел в темноте, чтобы изменить это, так что я должен изменить другую позицию? Если да, то какой? Или, может быть, есть что-то еще, что я должен сделать?

тот же веб-сервис отлично работает на моей локальной службе, поэтому я думаю, проблема заключается в удаленном IIS...

поздравления

11 82

11 ответов:

распространенной причиной этой ошибки является WebDAV. Убедитесь, что вы удалите его.

вам не нужно удалять WebDAV, просто добавьте эти строки в сеть.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

Измените Свой Веб.Конфигурационный файл, как показано ниже

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

Измените Свой Веб.Конфигурационный файл, как показано ниже. Это будет действовать как очарование.

в узле <system.webServer> добавить ниже часть кода

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

после добавления, ваш веб.Конфиг будет выглядеть как ниже

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <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" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

редкость, но может помочь некоторым.

убедитесь, что вы используете [HttpPut] С

Если ни одно из вышеперечисленных решений не решило вашу проблему, как в моем случае (все еще застрял с моим модулем RestClient перед 405 ) попробуйте запросить свой Api с помощью инструмента, такого как Postman или Fiddler. Я имею в виду, что проблема может быть в другом месте как плохо отформатированный запрос.

я обнаружил, что мой модуль RestClient запрашивал "Put" с идентификатором paremeter не очень хорошо отформатирован:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

вместо

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

кстати, плохо отформатированный запрос возвращает 405-метод нет Разрешено (IIS 7.5)

у меня это произошло (405 метод не разрешен), когда метод Web api post, который я вызывал, имел примитивные типы для параметров, а не сложный тип, который был доступен из тела. Вот так:

это работает:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

это не так:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

эта ошибка исходит от обработчика staticfile -- который по умолчанию не фильтрует никакие команды, но, вероятно, может иметь дело только с HEAD и GET.

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

поскольку вы используете WEBAPI, который из-за маршрутизации не имеет файлов и, следовательно, расширений, в ваш веб-сайт необходимо добавить следующие дополнения.конфигурационный файл:

<system.webserver>
    <httpProtocol>
        <handlers>
          ...
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

            <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

очевидно, что это нужны зависит от classicmode vs integratedmode, а classicmode зависит от разрядности. Кроме того, заголовок OPTIONS был добавлен для обработки CORS, но если вы не делаете CORS, вам это не нужно.

FYI, ваш веб.config-это локальная версия приложения (или каталога приложений), верхний уровень которой-applicationHost.конфиг.

в нашем случае проблема заключалась в Федеративной регистрации между сайтом .Net и ADFS. При перенаправлении на конечную точку ADFS wctx параметр необходимы все три параметра для WSFederationAuthenticationModule.CreateSignInRequest способ: rm,id и ru

спасибо Гийому Раймонду за подсказку, чтобы проверить параметры URL!

кроме всех вышеуказанных решений, проверьте, есть ли у вас "id" или любой пользовательский параметр в DELETE метод соответствует конфигурации маршрута.

public void Delete(int id)
{
    //some code here
}

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

конфигурация маршрута по умолчанию будет искать id в URL. Итак, имя параметра id важно здесь, Если вы не измените конфигурацию маршрута под App_Start папка.

вы можете изменить тип данных id хотя.

например метод ниже должен работать просто отлично:

public void Delete(string id)
{
    //some code here
}

Примечание: также убедитесь, что вы передаете данные по url не метод сведения, который будет нести полезную нагрузку текста.

DELETE http://{url}/{action}/{id}

пример:

DELETE http://localhost/item/1

надеюсь, что это помогает.

Если это IIS 8.0, проверьте, включена ли активация HTTP. Диспетчер серверов - > IIS - > управление (см. Справа вверху) -> добавление ролей и функций -> ... - >перейдите к конфигурации WCF, а затем выберите активация HTTP.