Tài nguyên được yêu cầu không hỗ trợ phương thức HTTP 'GET'


102

Tuyến đường của tôi được định cấu hình chính xác và các phương thức của tôi có thẻ được trang trí. Tôi vẫn nhận được thông báo "Tài nguyên được yêu cầu không hỗ trợ phương thức HTTP 'GET'"?

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}

Đây là các tuyến đường của tôi:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { controller = "Home", id = RouteParameter.Optional }
);

Câu trả lời:


226

Vui lòng sử dụng các thuộc tính từ System.Web. Http không gian tên trên các hành động WebAPI của bạn:

    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

Lý do tại sao nó không hoạt động là vì bạn đang sử dụng các thuộc tính từ không gian tên MVCSystem.Web.Mvc . Các lớp trong System.Web.Httpkhông gian tên dành cho WebAPI .


11
Chết tiệt .. cảm ơn! tôi sắp sửa có được lol điên đáng kinh ngạc như thế nào bạn có thể lãng phí thời gian vào những thứ nhỏ như vậy ..
Rushino

1
Thật vậy, một lời giải thích tại sao đây là câu trả lời chính xác chắc chắn là cần thiết ở đây!
Jaxidian

6
Câu trả lời đã được chỉnh sửa kèm theo lời giải thích.
Maggie Ying,

2
tôi có thể chỉ định [System.Web.Http.AcceptVerbs ("GET", "POST")] và [System.Web.Http.HttpGet] trong RouteConfig.cs để tôi không cần thêm cái này vào mỗi API không.
Girish Gupta

8
Tại sao tôi chỉ cần làm điều này trong một trong 10 apis của tôi cho dự án này? Tôi đã tạo api theo cách giống hệt như trong 9 api khác. Bực bội như thế nào.
Dan Beaulieu

3

chỉ cần sử dụng thuộc tính này

[System.Web.Http.HttpGet]

không cần dòng mã này:

[System.Web.Http.AcceptVerbs("GET", "POST")]

3

Trong trường hợp của tôi, chữ ký tuyến đường khác với tham số phương thức. Tôi đã có id, nhưng tôi đã chấp nhận documentId làm tham số, điều này gây ra sự cố.

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}

chúc phúc cho bạn :) +1
Shai Cohen

2

Tôi đã gặp phải vấn đề tương tự .. Tôi đã có 4 bộ điều khiển hoạt động tốt nhưng khi tôi thêm bộ điều khiển này, nó trả về "Tài nguyên được yêu cầu không hỗ trợ phương thức HTTP 'GET'". Tôi đã thử mọi thứ ở đây và trong một vài bài báo có liên quan khác nhưng không quan tâm đến giải pháp vì, như Dan B. đã đề cập trong câu trả lời, tôi đã có những người khác làm việc tốt.

Tôi bỏ đi một lúc, quay lại và ngay lập tức nhận ra rằng khi tôi thêm Bộ điều khiển, nó được lồng vào lớp "Bộ điều khiển" chứ không phải lớp "ApiController" mà các Bộ điều khiển khác của tôi đang ở dưới. Tôi giả sử rằng tôi đã chọn sai tùy chọn giàn giáo để tạo tệp .cs trong Visual Studio. Vì vậy, tôi đã bao gồm không gian tên System.Web.Http, thay đổi lớp cha và mọi thứ hoạt động mà không cần các thuộc tính hoặc định tuyến bổ sung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.