405 метод не допускается веб-api
эта ошибка очень распространена, и я пробовал все решения и не из них работал. Я отключил публикацию WebDAV в панели управления и добавил Это в свой файл web config:
<handlers>
<remove name="WebDAV"/>
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
ошибка все еще сохраняется. Это контроллер:
static readonly IProductRepository repository = new ProductRepository();
public Product Put(Product p)
{
return repository.Add(p);
}
способ реализации:
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
и вот где выбрасывается исключение:
client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/products", product);//405 exception
какие предложения?
18 ответов:
вы отправляете от клиента:
await client.PostAsJsonAsync("api/products", product);
не Путинг.
ваш метод Web API принимает только запросы PUT.
Так:
await client.PutAsJsonAsync("api/products", product);
у меня было такое же исключение. Моя проблема была в том, что я использовал:
using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; }
ДОЛЖНО БЫТЬ
using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; }
Я пробовал много вещей, чтобы получить удалить метод работы (я получал 405 метод не допускается веб-api), и, наконец, я добавил [маршрут ("api / scan / {id}")] к моему контроллеру и работал нормально. надеюсь, этот пост поможет кому-то.
// DELETE api/Scan/5 [Route("api/scan/{id}")] [ResponseType(typeof(Scan))] public IHttpActionResult DeleteScan(int id) { Scan scan = db.Scans.Find(id); if (scan == null) { return NotFound(); } db.Scans.Remove(scan); db.SaveChanges(); return Ok(scan); }
моя проблема оказалась маршрутизацией атрибутов в WebAPI. Я создал пользовательский маршрут, и он рассматривал его как GET вместо WebAPI, обнаружив, что это сообщение
[Route("")] [HttpPost] //I added this attribute explicitly, and it worked public void Post(ProductModel data) { ... }
Я знал, что это должно быть что-то глупое (что потребляет весь ваш день)
Я получал 405 на моем вызове GET, и проблема оказалась в том, что я назвал параметр в методе GET на стороне сервера
Get(int formId)
, и мне нужно было изменить маршрут, или переименовать егоGet(int id)
.
Chrome часто пытается сделать
OPTIONS
вызов перед выполнением поста. Он делает это, чтобы убедиться, что заголовки CORS в порядке. Это может быть проблематично, если вы не обрабатываетеOPTIONS
вызовите свой контроллер API.public void Options() { }
вы также можете получить ошибку 405, если говорите, что ваш метод ожидает параметр, и вы его не передаете.
Это не работает (405 ошибка)
HTML View / Javascript
$.ajax({ url: '/api/News', //.....
Web Api:
public HttpResponseMessage GetNews(int id)
таким образом, если сигнатура метода, как описано выше, то вы должны сделать:
HTML View / Javascript
$.ajax({ url: '/api/News/5', //.....
Если у вас есть маршрут, как
[Route("nuclearreactors/{reactorId}")]
вы должны использовать точно такое же имя параметра в методе, например
public ReactorModel GetReactor(reactorId) { ... }
Если вы не передадите точно такой же параметр, вы можете получить ошибку "405 метод не разрешен", потому что маршрут не будет соответствовать запросу, и WebApi ударит другой метод контроллера с другим разрешенным методом HTTP.
Я опаздываю на эту вечеринку, но поскольку ничто выше не было жизнеспособным или работающим в большинстве случаев, Вот как это было окончательно решено для меня.
на сервере, на котором размещался сайт / сервис, требовалась функция! АКТИВАЦИЯ HTTP!!!
диспетчер серверов > управление > добавить роли и функции > далее далее, пока вы не доберетесь до функций > под .NET (каждая версия) отметьте активацию HTTP. Также обратите внимание, что есть один скрытый под >net > WCF Сервисы.
Это тогда сработало мгновенно! Это плавило мой мозг
вот одно из решений
<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>
docs.microsoft.com решение статьи
и удалить WebDAV из модулей
<remove name="WebDAVModule" />
эта ошибка также может возникнуть при попытке подключиться к http, пока сервер находится на https.
Это было немного запутанно, потому что мои get-запросы были в порядке, проблема присутствовала только с post-запросами.
это не ответ на ваш конкретный вопрос, но когда у меня была такая же проблема, я оказался здесь, и я подумал, что больше людей могут сделать то же самое.
проблема у меня была, что я indeliberately заявил мой вам метод, как статический. Я пропустил это целое утро, и это не вызвало никаких предупреждений от атрибутов или подобных.
неправильно:
public class EchoController : ApiController { public static string Get() { return string.Empty; } }
правильно:
public class EchoController : ApiController { public string Get() { return string.Empty; } }
Я не мог решить эту проблему. Я включил CORS и работал до тех пор, пока сообщение не вернуло пустоту (ASP.NET 4.0-WEBAPI 1). Когда я попытался вернуть HttpResponseMessage, я начал получать ответ HTTP 405.
основываясь на ответе Ллада выше, я взглянул на свои собственные ссылки.
у меня был атрибут [System.Сеть.Mvc.HttpPost] перечислены выше мой метод POST.
Я изменил это, чтобы использовать:
[System.Web.Http.HttpPostAttribute] [HttpOptions] public HttpResponseMessage Post(object json) { ... return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; }
это исправило мои беды. Я надеюсь, что это помогает кому-то другому.
для полноты картины, у меня было следующее В моей сети.config:
<httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" /> <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" /> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol>
регистрация в проекте .csproj файл и изменить
<IISUrl>http://localhost:PORT/</IISUrl>
на ваш сайт url, как это
<IISUrl>http://example.com:applicationName/</IISUrl>
еще одна возможная проблема, которая вызывает такое же поведение параметров по умолчанию в маршрут. В моем случае контроллер был расположен и создан правильно, но сообщение было заблокировано из-за default
Get
действий, указанных:config.Routes.MapHttpRoute( name: "GetAllRoute", routeTemplate: "api/{controller}.{ext}"/*, defaults: new { action = "Get" }*/ // this was causing the issue );
у меня была точно такая же проблема. Я искал два часа, что было не так, не повезло, пока я не понял мой
POST
методprivate
вместоpublic
.смешно теперь видеть, что сообщение об ошибке является своего рода общим. Надеюсь, это поможет!
у нас была аналогичная проблема. Мы пытались получить от:
[RoutePrefix("api/car")] public class CarController: ApiController{ [HTTPGet] [Route("")] public virtual async Task<ActionResult> GetAll(){ } }
так мы бы
.GET("/api/car")
и это бросит405 error
.
Исправления:The
CarController.cs
файл был в директории/api/car
поэтому, когда мы запрашивали эту конечную точку api, IIS отправлял обратно ошибку, потому что казалось, что мы пытаемся получить доступ к виртуальному каталогу, который нам не разрешен.Вариант 1: изменить / переименовать каталог, в котором находится контроллер
Вариант 2: измените префикс маршрута на что-то, что не соответствует виртуальному каталогу.