[c#] 405 메서드가 허용되지 않는 웹 API

이 오류는 매우 일반적이며 모든 솔루션을 시도했지만 그중 어느 것도 작동하지 않았습니다. 제어판에서 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

어떤 제안?



답변

클라이언트에서 게시 중입니다.

await client.PostAsJsonAsync("api/products", product);

PUTing이 아닙니다.

웹 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";
}


답변

나는 DELETE 메소드 작업을 얻기 위해 많은 것을 시도했고 (웹 API가 허용되지 않는 405 메소드를 얻었습니다) 마침내 [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의 속성 라우팅으로 밝혀졌습니다. 사용자 지정 경로를 만들었고 WebAPI 대신 GET처럼 처리하여 POST임을 발견했습니다.

    [Route("")]
    [HttpPost] //I added this attribute explicitly, and it worked
    public void Post(ProductModel data)
    {
        ...
    }

나는 그것이 어리석은 일이어야한다는 것을 알고 있었다 (하루 종일 소비)


답변

Chrome은 종종 OPTIONS게시물을 작성하기 전에 통화를 시도합니다 . CORS 헤더가 올바른지 확인하기 위해이 작업을 수행합니다. OPTIONSAPI 컨트롤러에서 호출을 처리하지 않으면 문제가 될 수 있습니다 .

public void Options() { }


답변

이 오류는 서버가 https에있는 동안 http에 연결하려고 할 때도 발생할 수 있습니다.

내 get-request가 괜찮 았기 때문에 약간 혼란 스러웠고 문제는 사후 요청에만 존재했습니다.


답변

GET 호출에서 405를 얻었고 GET 서버 측 메서드에서 매개 변수 이름을 지정 Get(int formId)했으며 경로를 변경하거나 이름을 변경해야 한다는 문제가 나타났습니다 Get(int id).