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 70

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>

[HttpPost] не нужно!

[Route("")]
public void Post(ProductModel data)
{
    ...
}

регистрация в проекте .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: измените префикс маршрута на что-то, что не соответствует виртуальному каталогу.