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, похоже, отключены.
любые идеи будут высоко оценены
Спасибо.
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