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 ответов:
распространенной причиной этой ошибки является 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>
Если ни одно из вышеперечисленных решений не решило вашу проблему, как в моем случае (все еще застрял с моим модулем 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
надеюсь, что это помогает.