2013-09-06 28 views
12

Tôi cần một bộ điều khiển để trả về JSON được JavaScript sử dụng để tôi được kế thừa từ lớp ApiController nhưng nó không hoạt động như tôi mong đợi. Các Apress cuốn sách Pro ASP.NET MVC 4 và hầu hết các ví dụ trực tuyến Tôi đã tìm thấy cho ví dụ như:Tuyến đường API web đến tên hành động

public class ServicesController : ApiController 
{ 
    public string[] MethodFruit() 
    { 
     return new string[] { "Apple", "Orange", "Banana" }; 
} 

truy cập thông qua URL:

http://mysite/services/methodfruit 

Nhưng điều đó không bao giờ làm việc - các tài nguyên isn Không tìm thấy. Cách tiếp cận duy nhất tôi có thể làm việc là để bộ điều khiển chứa một phương thức khác cho mỗi động từ HTTP, sau đó:

http://mysite/api/services 

Gọi phương thức GET.

Tôi đã kiểm tra trang web Apress nhưng dường như chúng không có bất kỳ diễn đàn nào và mã nguồn hiện tại nằm trong VS 2012 mà tôi không sử dụng. Tôi đã kiểm tra các tệp nguồn và dường như họ nghĩ rằng cách tiếp cận trước đây sẽ hoạt động. Cách tiếp cận cũ không còn được hỗ trợ?

Trả lời

27

Yep ... thông thường bạn phải tuân theo quy ước đặt tên mặc định được mong đợi bởi ASP.NET WEB API.

Kiểm tra doc chính thức này:

Routing in ASP.NET Web API

Nếu bạn không muốn làm theo quy ước, bạn có thể thử Routing cung cấp bởi Action Tên phần mô tả trong doc liên kết ở trên.

Routing cung cấp bởi Action Tên

Với mẫu định tuyến mặc định, Web API sử dụng phương thức HTTP để chọn hành động. Tuy nhiên, bạn cũng có thể tạo ra một con đường nơi tên hành động được bao gồm trong URI:

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

Trong trường hợp của bạn, bạn phải làm điều này:

[HttpGet] 
public string[] MethodFruit() 
{ 
    return new string[] { "Apple", "Orange", "Banana" }; 
} 
+0

Cảm ơn. Tôi sẽ đọc qua tài liệu đó. – David

+1

Tôi đã làm điều tương tự. Nhưng tôi muốn nhận hàm này gọi là yêu cầu 'POST'. Tôi đã thêm '{action}' vào route và thêm '[AcceptVerbs (" GET "," POST ")]' thay vì '[HttpGet]'. Nhưng nó nói 404 khi truy cập vào API này bằng cách thực hiện một yêu cầu đăng bài. Khi không có vấn đề với 'GET'. Tên hành động của tôi là 'GetAuthToken'. Tôi thực sự không thể giải quyết vấn đề này. Hãy giúp tôi. – shashwat

+0

@shashwat kiểm tra xem điều này có giải quyết được vấn đề của bạn không: http://stackoverflow.com/a/12766431/114029 –

6

Nếu bạn muốn API Web để tìm tên hành động khi định tuyến, thay đổi lớp WebApiConfig.cs trong thư mục App_Start thành:

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

Sau đó, bạn có thể j ust tạo ra một yêu cầu GET để

http://mysite/api/Services/MethodFruit 
+0

Tôi đã bỏ lỡ WebApiConfig. cs lớp hoàn toàn. Bây giờ tôi đã tự hỏi tại sao lớp RouteConfig không thay đổi ... – David

4

tôi bổ sung thêm thông tin về câu trả lời ở trên .. Thêm RoutePrefix sẽ khắc phục vấn đề ..Hy vọng nó giúp

khiển

[RoutePrefix("api/Services")] 
    public class ServicesController : ApiController 
    { 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     [Route("MethodFruit")] 
     public string[] MethodFruit() 
     { 
      return new string[] { "Apple", "Orange", "Banana" }; 
     } 
    } 

Trong cấu hình

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

Sử dụng [RoutePrefix ("api/referencedata")] và [Route ("products")] trên phương thức action là điều duy nhất đã làm việc cho tôi. Không khi tôi sử dụng [Route ("api/referencedata")] [ActionName ("products")] – MartinS

0

tôi đã phải đối mặt với cùng một vấn đề, tôi phát hiện ra rằng trên mã của tôi

using System.Web.Mvc; 

tôi đã nhập MVC intead của việc sử dụng System.Web.Http. do đó, nó đang sử dụng định tuyến Mvc không phải là tuyến đường webApi. Tôi đã thay thế điều đó bằng

using System.Web.Http 

và nó hoạt động cho tôi. Tôi đang thêm câu trả lời của tôi để người mới không lặp lại cùng một sai lầm

Các vấn đề liên quan