ASP.NET Web Api: Tài nguyên được yêu cầu không hỗ trợ phương thức http 'GET'


92

Tôi có hành động sau trên ApiController:

public string Something()
{
    return "value";
}

Và tôi đã định cấu hình các tuyến đường của mình như sau:

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

Trong bản beta, điều này hoạt động tốt, nhưng tôi vừa cập nhật lên Ứng cử viên phát hành mới nhất và bây giờ tôi thấy lỗi trên các cuộc gọi như sau:

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

Tại sao điều này không hoạt động nữa?

(Tôi cho rằng tôi có thể loại bỏ {action} và chỉ tạo ra rất nhiều bộ điều khiển, nhưng điều đó cảm thấy lộn xộn.)

Câu trả lời:


107

Nếu bạn chưa định cấu hình bất kỳ HttpMethod nào trên hành động của mình trong bộ điều khiển, nó được coi là chỉ HttpPost trong RC. Trong phiên bản Beta, nó được giả định là hỗ trợ tất cả các phương pháp - GET, PUT, POST và Delete. Đây là một thay đổi nhỏ từ phiên bản beta sang RC. Bạn có thể dễ dàng ghi nhớ nhiều httpmethod cho hành động của mình với [AcceptVerbs ("GET", "POST")].


vừa gặp phải điều này, cảm ơn vì đã sửa lỗi, nhưng tò mò, tại sao tôi phải làm điều này với các phương thức tùy chỉnh của mình, mà không phải là phương thức "Nhận" mặc định? Tôi có một phương thức Get được tạo bởi mẫu cho bộ điều khiển, nhưng nó không được trang trí. điều này chỉ là theo quy ước vì tên Get?
SelAromDotNet

3
@Josh: Vâng! Khi tên của phương thức hành động bắt đầu bằng "Get ...", bạn không cần phải đánh dấu nó là phương thức GET. Đọc thêm tại đây: asp.net/web-api/overview/web-api-routing-and-actions/…
Jenny O'Reilly

Tôi đã làm như được đề xuất trong câu trả lời nhưng bây giờ cả hai lệnh gọi của tôi, Nhận và Đăng, đang được chuyển hướng sang Nhận hành động. Bất kỳ giúp đỡ xin vui lòng?
Syed Ali Taqi

54

Tất cả thông tin trên đều đúng, tôi cũng muốn chỉ ra rằng [AcceptVerbs()]chú thích tồn tại trong cả không gian tên System.Web.Mvc và System.Web.Http.

Bạn muốn sử dụng System.Web.Http nếu đó là bộ điều khiển API Web.


@Eric. Tuyệt vời, đây là lý do nó không hoạt động với tôi. Tôi đã có động từ trong hành động của mình nhưng nó được tham chiếu qua Web.Mvc nên không hoạt động.
dreza,

Tuyệt vời, Bạn đã cứu một ngày của tôi
Hossein Narimani Rad

Cảm ơn bạn rất nhiều, vì System.Web.Mvc không tốt cho tôi.
Burak Karakuş

34

Mặc dù đây không phải là câu trả lời cho OP, nhưng tôi đã gặp cùng một lỗi chính xác từ một nguyên nhân gốc hoàn toàn khác; vì vậy trong trường hợp điều này sẽ giúp bất kỳ ai khác ...

Vấn đề đối với tôi là tham số phương thức được đặt tên không chính xác khiến WebAPI định tuyến yêu cầu một cách bất ngờ. Tôi có các phương thức sau trong ProgrammesController của mình:

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

Các yêu cầu DELETE tới ... / api / Programs / 3 không được chuyển đến DeleteProgramme như tôi mong đợi, mà đến GetProgrammeById, vì DeleteProgramme không có tên tham số là id. GetProgrammeById sau đó tất nhiên từ chối DELETE vì nó được đánh dấu là chỉ chấp nhận GET.

Vì vậy, cách khắc phục rất đơn giản:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

Và tất cả đều tốt. Sai lầm ngớ ngẩn thực sự nhưng khó gỡ lỗi.


1
Nếu có ai đang sử dụng định tuyến url, hãy thử làm như [Route ("{programmeId = programmeId: int}")]
sree

1
Đây là nó cho tôi. WebApiConfig -> MapHttpRoutes có -> routeTemplate: "api / {controller} / {id}", do đó, phải sử dụng tham số 'id'.
Khúc côn cầuJ

1
Câu trả lời của bạn chỉ cho tôi cho vấn đề của tôi đó là một chút khác nhau tôi đã thay đổi tên của một [FromUri] tham số cho phương pháp này và không cập nhật nó trên các mặt hàng
Matus

22

Nếu bạn đang trang trí cho phương pháp của mình HttpGet, hãy thêm phần sau usingvào đầu bộ điều khiển:

using System.Web.Http;

Nếu bạn đang sử dụng System.Web.Mvc, thì sự cố này có thể xảy ra.


5
Điều này đúng, và thật nực cười. NET không hiển thị thông báo rõ ràng.
Teoman shipahi

15

Đây chắc chắn là một sự thay đổi từ Beta sang RC. Trong ví dụ được cung cấp trong câu hỏi, bây giờ bạn cần trang trí hành động của mình bằng [HttpGet] hoặc [AcceptVerbs ("GET")].

Điều này gây ra vấn đề nếu bạn muốn kết hợp các hành động dựa trên động từ (tức là "GetSomething", "PostSomething") với các hành động không dựa trên động từ. Nếu bạn cố gắng sử dụng các thuộc tính trên, nó sẽ gây ra xung đột với bất kỳ hành động dựa trên động từ nào trong bộ điều khiển của bạn. Một cách để có được sự cố đó là xác định các tuyến đường riêng biệt cho mỗi động từ và đặt hành động mặc định thành tên của động từ. Phương pháp này có thể được sử dụng để xác định tài nguyên con trong API của bạn. Ví dụ: mã sau hỗ trợ: "/ resource / id / children" trong đó id và con là tùy chọn.

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

Hy vọng rằng các phiên bản tương lai của API Web sẽ hỗ trợ tốt hơn cho trường hợp này. Hiện có một sự cố được ghi lại trên dự án codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Nếu đây là điều bạn muốn xem, vui lòng bỏ phiếu cho vấn đề.


8

Có cùng thiết lập như OP. Một bộ điều khiển với nhiều hành động ... bớt "lộn xộn" hơn :-)

Trong trường hợp của tôi, tôi đã quên "[HttpGet]" khi thêm một hành động mới.

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}

6

Cùng một vấn đề như trên, nhưng gốc rễ khác nhau rất nhiều. Đối với tôi, đó là tôi đã đạt được điểm cuối với quy tắc viết lại https. Đánh vào http gây ra lỗi, hoạt động như mong đợi với https.


3

Thay thế mã sau trong đường dẫn này

Con đường :

App_Start => WebApiConfig.cs

Mã:

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

1

Tôi không biết liệu điều này có thể liên quan đến bài đăng của OP hay không nhưng tôi đã thiếu chú thích [HttpGet] và đó là nguyên nhân gây ra lỗi, như đã nêu bởi các phương thức @dinesh_ravva được giả định là HttpPost theo mặc định.


0

Vấn đề của tôi rất đơn giản là có một tham chiếu rỗng không hiển thị trong thông báo được trả lại, tôi phải gỡ lỗi API của mình để xem nó.

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.