405 메서드가 허용되지 않는 웹 API


90

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

어떤 제안?

답변:


62

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

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

PUTing이 아닙니다.

웹 API 메서드는 PUT 요청 만 허용합니다.

그래서:

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

코드를 시도 할 때 'HttpClient'에 'PostAsJsonAsync'에 대한 정의가 포함되어 있지 않습니다. 오류가 발생합니다.
agileDev

61

나는 같은 예외가 있었다. 내 문제는 내가 사용했다는 것입니다.

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

18

나는 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);
    }

어떤 이유로 내 삭제에만 작동하지 않았으며 생성 및 업데이트가 제대로 작동했습니다. 음, 방금 [HttpPost]를 추가했는데 제대로 작동했습니다. 하지만 덕분에, 당신은 : 바른 길에 저를 얻었다 단지 5 분 지금 나 비용
Rubenisme

1
[HttpDelete] 속성 만 추가하지 않는 이유는 무엇입니까?
johnny 5

14

내 문제는 WebAPI의 속성 라우팅으로 밝혀졌습니다. 사용자 지정 경로를 만들었고 WebAPI 대신 GET처럼 처리하여 POST임을 발견했습니다.

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

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


이것은 내 하루를 구했습니다!
Phate01

6

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

public void Options() { }

6

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

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


4

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


4

메소드가 매개 변수를 예상하고 전달하지 않는 경우에도 405 오류가 발생할 수 있습니다.

작동하지 않습니다 (405 오류).

HTML보기 / 자바 스크립트

$.ajax({
         url: '/api/News',
         //.....

웹 API :

public HttpResponseMessage GetNews(int id)

따라서 메서드 서명이 위와 같으면 다음을 수행해야합니다.

HTML보기 / 자바 스크립트

$.ajax({
         url: '/api/News/5',
         //.....

여러 가지 이유로 405 오류가 발생하는 것 같습니다. 메서드 서명과 매개 변수 문제 또는 규칙 이름 지정 문제 또는 속성 문제 등을 HIT하려고 시도한다는 사실로 모두
요약됩니다

4

나는이 파티에 늦었지만 위의 어떤 것도 대부분의 경우 실행 가능하거나 작동하지 않았기 때문에 이것이 마침내 나를 위해 해결 된 방법입니다.

사이트 / 서비스가 호스팅 된 서버에서 기능이 필요했습니다! HTTP 활성화 !!!

서버 관리자> 관리> 역할 및 기능 추가> 기능> .NET (각 버전)에서 HTTP 활성화를 선택할 때까지 다음으로 이동합니다. 또한> net> WCF Services 아래에 숨겨진 항목이 있습니다.

이것은 즉시 작동했습니다! 내 뇌를 녹이고 있었어


4

다음과 같은 경로가있는 경우

[Route("nuclearreactors/{reactorId}")]

메소드에서 정확히 동일한 매개 변수 이름을 사용해야합니다.

public ReactorModel GetReactor(reactorId)
{
 ...
}

정확히 동일한 매개 변수를 전달하지 않으면 경로가 요청과 일치하지 않고 WebApi가 허용 된 다른 HTTP 메소드를 사용하여 다른 컨트롤러 메소드에 도달하기 때문에 "405 메소드가 허용되지 않음"오류가 표시 될 수 있습니다.


이것도 답이 아닙니다!
Divyang Desai

@Div "405 method not allowed"는 경로 설정이 유효하지 않기 때문에 메서드가 api-call을 포착하지 않기 때문에 공유 한 경우에 표시 될 수 있습니다. 그런 다음 api-call이 다른 HTTP 작업을 허용 할 수있는 의도하지 않은 다른 메서드를 공격 할 수 있습니다. 예,이 답변이 실제 질문과 100 % 관련이 없다는 데 동의합니다. 그러나 Xardas의 질문 제목은 그다지 구체적이지 않으며 제목에 명시된 질문에 대한 답변을 찾기 위해 여기에 온 많은 사람들이 이 답변이 유용하다고 생각하십시오.
roylac


3

이것은 당신의 구체적인 질문에 대한 대답은 아니지만, 제가 같은 문제를 겪었을 때 저는 여기까지 왔고 더 많은 사람들이 똑같이 할 것이라고 생각했습니다.

내가 가진 문제는 내가 의도하지 않게 내 Get 메서드를 static 으로 선언했다는 것 입니다. 나는 전체 오전을 놓 쳤고 속성이나 유사한 경고를 일으키지 않았습니다.

틀림 :

public class EchoController : ApiController
{
    public static string Get()
    {
        return string.Empty;
    }
}

옳은:

public class EchoController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }
}

2

[HttpPost]는 불필요합니다!

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

1
예, 명시적인 [HttpPost]를 필요로하지 않는다는 점에서 정확합니다. 그러나 규칙 (yikes)을 따르지 않는 사람이 있으므로 [Route ( "MyMethodSaver"] public string MyMethodtoSave (int? ID가) -> 그건 [HttpPost]과 것 다음 작업 필요
톰 Stickel

2

나는 이것을 해결할 수 없었다. POST가 무효 (ASP.NET 4.0-WEBAPI 1)를 반환하는 한 CORS를 활성화하고 작업했습니다. HttpResponseMessage를 반환하려고 할 때 HTTP 405 응답을 받기 시작했습니다.

위의 Llad의 응답을 바탕으로 내 자신의 참조를 살펴 보았습니다.

내 POST 메서드 위에 나열된 [System.Web.Mvc.HttpPost] 특성이 있습니다.

나는 이것을 사용하도록 변경했습니다.

[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>

이것은 옵션에서 호출하는 방법이있을 것이다하는 것은 포인트가되는 (물론 POST에 등) 요청, 비행 전 json가능성이 null비행 전 요청은 일반적으로 페이로드가없는, 또는 두 번 포스트 작업을 실행 것이기 때문에합니다.
glennsl

1

비슷한 문제가있었습니다. 우리는 다음에서 가져 오려고했습니다.

[RoutePrefix("api/car")]
public class CarController: ApiController{

    [HTTPGet]
    [Route("")]
    public virtual async Task<ActionResult> GetAll(){

    }

}

우리 것 그래서 .GET("/api/car")이가 던질 것이다 405 error.


수정 :

CarController.cs파일 디렉토리에 있었다/api/car 우리가이 API 엔드 포인트를 요청했을 때 우리가 우리가 허용되지 않았 음을 가상 디렉터리에 액세스하려고했던처럼 보였다 때문에, IIS가 오류를 다시 보내는 것 때문에.

옵션 1 : 컨트롤러가있는 디렉터리 변경 / 이름 바꾸기
옵션 2 : 경로 접두사를 가상 디렉터리와 일치하지 않는 항목으로 변경합니다.


1

필자의 경우 프로젝트에 WebAPI 경로 (예 : 샌드 박스)와 이름이 같은 실제 폴더가 있었고 POST 요청 만 IIS의 정적 파일 처리기에 의해 가로 채었습니다 (분명히).

예상했던 404 대신 오해의 소지가있는 405 오류가 발생하여 문제를 해결하는 데 오랜 시간이 걸렸습니다.

이것에 빠지기가 쉽지는 않지만 가능합니다. 누군가에게 도움이되기를 바랍니다.


1

내 POST 처리기는 다음과 같은 형식이었습니다.

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)

나는 인자 , 즉 body 데이터를 먼저 말한 다음 route 매개 변수를 다음과 같이 바꿔야 한다는 것을 알아 냈습니다 .

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)

0

프로젝트 .csproj 파일을 체크인하고 변경하십시오.

<IISUrl>http://localhost:PORT/</IISUrl>

웹 사이트 URL에 다음과 같이

<IISUrl>http://example.com:applicationName/</IISUrl>

0

동일한 동작을 일으키는 또 다른 가능한 문제는 라우팅의 기본 매개 변수입니다. 제 경우에는 컨트롤러를 찾아서 올바르게 인스턴스화했지만 Get지정된 기본 작업으로 인해 POST가 차단되었습니다 .

config.Routes.MapHttpRoute(
    name: "GetAllRoute",
    routeTemplate: "api/{controller}.{ext}"/*,
    defaults: new { action = "Get" }*/ // this was causing the issue
);

0

나는 똑같은 문제를 겪고 있었다. 나는 내 POST방법이 private대신에 있다는 것을 깨달을 때까지 운이없는 문제를 두 시간 동안 찾았습니다.public .

이제 그 오류 메시지를 보는 것이 재미 있습니다. 도움이 되었기를 바랍니다.


0

컨트롤러가 다음에서 상속되는지 확인하십시오. Controller 클래스 .

그것 없이도 물건이 로컬에서 작동한다는 것은 더 미친 것일 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.