WebAPI Удалить не работает - 405 Метод не разрешен

Я ценю любую помощь по этому поводу, так как сайт должен жить сегодня вечером!

У меня есть контроллер веб-api с методом Delete. Метод отлично работает на моем локальном компьютере, на котором запущен IIS Express (Windows 8), но как только я развернул его на сервере IIS (Windows Server 2008 R2), он прекратил работу и выдает следующее сообщение об ошибке:

Ошибка HTTP 405.0 - метод не разрешен Страница, которую вы ищете, не может отображаться, поскольку используется недействительный метод (HTTP-глагол)

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

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<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>

Я также попытался изменить сопоставления обработчиков и фильтрацию запросов в IIS безрезультатно. Обратите внимание, что правила WebDAV Authoring Rules в IIS, похоже, отключены.

Любые идеи будут высоко оценены Спасибо.

Ответ 1

Я нашел решение в конце концов! Если вы столкнетесь с одной и той же проблемой, добавьте следующее в свой web.config

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

Я надеюсь, что это поможет

Ответ 2

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

500.21 Обработчик "WebDAV" имеет плохой модуль "WebDAVModule" в своем списке модулей

Модуль: IIS Web Core Notification: ExecuteRequestHandler "

было предложено здесь. Также нужно удалить его из обработчиков.

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

Ответ 3

В моем случае ни одно из вышеперечисленных решений не работало. Это произошло потому, что у меня изменилось имя параметра в моем методе Delete.

У меня был

public void Delete(string Questionid)

вместо

public void Delete(string id)

Мне нужно использовать имя id, потому что это имя, объявленное в моем файле WebApiConfig. Обратите внимание на имя id в третьей и четвертой строках:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Я получил это решение от здесь.

Ответ 4

Глагол Javascript для HTTP DELETE должен быть таким:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Do not использовать что-то вроде этого:

...
data: {id:id}
...

как при использовании метода POST.

Ответ 5

У меня также была та же проблема, я вызываю WebAPi и получаю эту ошибку. Добавление следующей конфигурации в web.config для служб решает мою проблему

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

в файле web.config решена моя проблема. Это как я звонил с клиентской стороны

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}

Ответ 6

Перейдите в файл applicationHost.config(обычно под C:\Windows\System32\inetsrv\config) и закомментируйте следующую строку в applicationHost.config

1) В разделе < обработчики > :

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) Также закомментируйте следующий модуль, переданный вышеупомянутым обработчиком в разделе "lt > modules >

<add name="WebDAVModule" />

Ответ 7

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

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>

Ответ 8

У меня был 405 метод ошибки не разрешен, потому что я не указал, что метод Delete на публичном контроллере WebApi открыт.

Мне потребовалось много времени, чтобы найти это (слишком долго!), потому что я ожидал ошибку Not Found в этом случае, поэтому я неправильно предполагал, что мой метод Delete был отклонен.

Причиной не разрешенного, а не не найденного является то, что у меня также был метод Get для того же маршрута (который будет обычным делом при реализации REST). Функция Public Get соответствует маршрутизации, а затем отрицается из-за неправильного метода http.

Простая ошибка, которую я знаю, но это может спасти кого-то еще некоторое время.

Ответ 9

Просто добавьте. Если это ваш конфиг

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }

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

Ответ 10

Атрибут

[HttpPost] в верхней части метода Delete решил эту проблему для меня:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

Ответ 11

У меня была аналогичная проблема, но для PUT - ни один из других предложений не работал у меня.

Однако я использовал int вместо стандартного string для id. добавив {id:int} к маршруту, разрешив мою проблему.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

Ответ 12

Нам пришлось добавлять пользовательские заголовки в наш web.config, поскольку наш запрос имел несколько заголовков, которые путали ответ API.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

Ответ 13

В моем случае я пропустил добавление {id} к [Route("")] и получил ту же ошибку. Добавление, которое решило проблему для меня: [Route("{id}")]