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



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



У меня есть контроллер web api с методом Delete. Метод отлично работает на моей локальной машине под управлением IIS Express( Windows 8), но как только я развернул его на сервере live 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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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 в IIS, похоже, отключены.



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

773   12  

12 ответов:

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

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

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

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

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

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

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

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

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

Я

public void Delete(string Questionid)

вместо

public void Delete(string id)

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

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

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

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 не использовать что-то вроде этого:

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

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

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

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

в интернете.конфигурационный файл решил мою проблему. Вот как я звонил со стороны клиента

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

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

1) в разделе :

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

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

<add name="WebDAVModule" />

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.