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}")]