Эта ошибка очень распространена, я попробовал все решения, и ни одно из них не сработало. Я отключил публикацию WebDAV в панели управления и добавил это в свой файл веб-конфигурации:
<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
Какие-либо предложения?
c#
asp.net-web-api
webdav
Xardas
источник
источник
У меня было такое же исключение. Моя проблема заключалась в том, что я использовал:
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"; }
источник
Я пробовал много всего, чтобы заставить работать метод DELETE (я получал 405 метод, не разрешенный веб-API), и, наконец, я добавил [Route ("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, обнаружив, что это POST
[Route("")] [HttpPost] //I added this attribute explicitly, and it worked public void Post(ProductModel data) { ... }
Я знал, что это должно быть что-то глупое (это занимает весь ваш день)
источник
Chrome часто пытается
OPTIONS
позвонить перед публикацией. Это делается для того, чтобы заголовки CORS были в порядке. Это может быть проблематично, если вы не обрабатываетеOPTIONS
вызов в своем контроллере API.public void Options() { }
источник
Эта ошибка также может возникнуть, когда вы пытаетесь подключиться к http, когда сервер находится на https.
Это немного сбивало с толку, потому что мои запросы на получение были в порядке, проблема была только с пост-запросами.
источник
Я получал 405 при вызове GET, и проблема оказалась в том, что я назвал параметр в методе GET на стороне сервера
Get(int formId)
, и мне нужно было изменить маршрут или переименовать егоGet(int id)
.источник
Вы также можете получить ошибку 405, если скажете, что ваш метод ожидает параметр, а вы его не передаете.
Это НЕ работает (ошибка 405)
Просмотр HTML / Javascript
$.ajax({ url: '/api/News', //.....
Веб-API:
public HttpResponseMessage GetNews(int id)
Таким образом, если подпись метода аналогична приведенной выше, вы должны сделать:
Просмотр HTML / Javascript
$.ajax({ url: '/api/News/5', //.....
источник
Я опаздываю на эту вечеринку, но поскольку в большинстве случаев ничего из вышеперечисленного не было жизнеспособным или работающим, вот как это было окончательно решено для меня.
На сервере, на котором размещался сайт / сервис, требовалась функция! АКТИВАЦИЯ HTTP !!!
Это сработало мгновенно! Это плавило мой мозг
источник
Если у вас есть маршрут вроде
[Route("nuclearreactors/{reactorId}")]
Вам нужно использовать то же самое имя параметра в методе, например
public ReactorModel GetReactor(reactorId) { ... }
Если вы не передадите тот же самый параметр, вы можете получить ошибку «405 метод не разрешен», потому что маршрут не будет соответствовать запросу, и WebApi будет использовать другой метод контроллера с другим разрешенным методом HTTP.
источник
Вот одно решение
<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>
статья о решении docs.microsoft.com
и удалите WebDAV из модулей
<remove name="WebDAVModule" />
источник
Это не отвечает на ваш конкретный вопрос, но когда у меня возникла такая же проблема, я оказался здесь и решил, что больше людей могут сделать то же самое.
Проблема заключалась в том, что я намеренно объявил свой метод Get статическим . Я пропустил это всю полдень, и никаких предупреждений от атрибутов и т.п. не было.
Неправильно:
public class EchoController : ApiController { public static string Get() { return string.Empty; } }
Верный:
public class EchoController : ApiController { public string Get() { return string.Empty; } }
источник
[HttpPost] не нужен!
[Route("")] public void Post(ProductModel data) { ... }
источник
Я НЕ мог решить эту проблему. У меня был включен CORS, и он работал, пока POST не возвращал void (ASP.NET 4.0 - WEBAPI 1). Когда я попытался вернуть HttpResponseMessage, я начал получать ответ HTTP 405.
Основываясь на ответе Ллада выше, я взглянул на свои собственные ссылки.
У меня был атрибут [System.Web.Mvc.HttpPost], указанный выше моего метода POST.
Я изменил это на использование:
[System.Web.Http.HttpPostAttribute] [HttpOptions] public HttpResponseMessage Post(object json) { ... return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; }
Это устранило мои беды. Надеюсь, это поможет кому-то другому.
Для полноты картины в моем web.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>
источник
json
вполне вероятно,null
поскольку предполетные запросы обычно не имеют полезных данных, или вы дважды запустите действие публикации.У нас была аналогичная проблема. Мы пытались ПОЛУЧИТЬ из:
[RoutePrefix("api/car")] public class CarController: ApiController{ [HTTPGet] [Route("")] public virtual async Task<ActionResult> GetAll(){ } }
Так мы бы
.GET("/api/car")
и это бросили405 error
.Исправление:
CarController.cs
Файл находился в каталоге/api/car
поэтому , когда мы были запросив апи конечной точку, IIS будет возвращать ошибку , потому что казалось, что мы пытались получить доступ к виртуальному каталогу , который мы не разрешались.Вариант 1: изменить / переименовать каталог, в котором находится контроллер.
Вариант 2: изменить префикс маршрута на то, что не соответствует виртуальному каталогу.
источник
В моем случае у меня была физическая папка в проекте с тем же именем, что и у маршрута WebAPI (например, песочница), и только запрос POST был перехвачен обработчиком статических файлов в IIS (очевидно).
Получение вводящей в заблуждение ошибки 405 вместо более ожидаемой 404 было причиной, по которой мне потребовалось много времени, чтобы устранить неполадки.
Попасть в это непросто, но возможно. Надеюсь, это кому-то поможет.
источник
Со своей стороны мой обработчик POST имел такую форму:
[HttpPost("{routeParam}")] public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)
Я понял, что мне пришлось поменять местами аргументы , то есть сначала данные тела, а затем параметр маршрута, как это:
[HttpPost("{routeParam}")] public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)
источник
проверьте файл .csproj вашего проекта и измените
<IISUrl>http://localhost:PORT/</IISUrl>
на URL-адрес вашего веб-сайта
<IISUrl>http://example.com:applicationName/</IISUrl>
источник
Другая возможная проблема, которая вызывает такое же поведение, - это параметры маршрутизации по умолчанию. В моем случае контроллер был обнаружен и создан правильно, но POST был заблокирован из-за
Get
указанного действия по умолчанию :config.Routes.MapHttpRoute( name: "GetAllRoute", routeTemplate: "api/{controller}.{ext}"/*, defaults: new { action = "Get" }*/ // this was causing the issue );
источник
У меня была точно такая же проблема. Я два часа искал, что было не так, но безуспешно, пока не понял, что мой
POST
метод былprivate
вместо этогоpublic
.Забавно, что теперь это сообщение об ошибке носит общий характер. Надеюсь, это поможет!
источник
Убедитесь, что ваш контроллер наследуется от
Controller
класса.Было бы даже более безумно, что все работало бы локально даже без этого.
источник