2013-03-30 2 views
29

Tôi đã cấu hình WebApiConfig của tôi như thế này:Không tài nguyên HTTP đã được tìm thấy phù hợp với yêu cầu URI trong Web API

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

Tôi có một phương pháp mà chấp nhận một tham số. URI truy cập là http://localhost:8598/api/WebApi/GetLocationCategory/87.

này mang lại cho tôi một lỗi: No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'

Bộ điều khiển:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int CatID) 
{ 
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == CatID select new { lc.LocationID, lc.LocationName }).ToList(); 
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>(); 

    foreach (var element in LocCats) 
    { 
     loc.Add(new LocationCategory_CLS 
     { 
      LocationID = element.LocationID, 
      LocationName = element.LocationName 
     }); 
    } 
    return loc; 
} 
+2

Giải quyết được vấn đề URI nên là: http: // localhost: 8598/api/WebAPI/GetLocationCategory CatID = 87 – DharaPPatel

Trả lời

3

tên của bộ điều khiển và hành động của bạn là gì?

URL phải

http://localhost:8598/api/Controller/Action 

Nó không bản đồ để Configuration Route bạn đã xác định, vì thế đường ống là không có khả năng xác định vị trí điều khiển chính xác./Id không phải ở trong con đường nó phải nằm trong cơ thể hoặc các tham số truy vấn (Tôi đã bối rối trong sự vội vàng !!)

Ví dụ: -

public class FooController : ApiController 
    { 
     public int GetIndex(int id) 
     { 
      return id; 
     } 
    } 

localhost:58432/api/foo/GetIndex?Id=1 

O/P :- 1 

Lưu ý: - Nếu tên của bạn là hành động GetIndex thì URL phải là GetIndex không chỉ là Chỉ mục. Tùy chọn bạn có thể chỉ định thuộc tính [HttpGet] cho hành động.

Nếu bạn có sau đây cũng như trong WebApi.config bạn

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

Sau đó http://localhost:58432/api/foo?Id=1 sẽ cũng là một con đường hợp pháp. Không chắc chắn nếu bạn muốn điều đó.

Ngoài ra, với WebAPI càng nhiều càng tốt để định tuyến không dựa trên hành động, MVC có nghĩa là cho điều đó. Nó không phải là cách được đề nghị.

+0

tên điều khiển: WebAPI , Tên hành động: GetLocationCategory, đường dẫn là chính xác tôi đoán! không thể tìm ra vấn đề .. – DharaPPatel

+0

đăng mã cho bộ điều khiển ?? –

+0

đã chỉnh sửa bài đăng gốc để có thêm mã – DharaPPatel

22

Hãy thử thay đổi phương pháp điều khiển của bạn như

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id) <-- Change 
{ 
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == id select new { lc.LocationID, lc.LocationName }).ToList(); 
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>(); 

    foreach (var element in LocCats) 
    { 
     loc.Add(new LocationCategory_CLS 
     { 
      LocationID = element.LocationID, 
      LocationName = element.LocationName 
     }); 
    } 
    return loc; 
} 

Sự thay đổi duy nhất là, thay đổi thông số đầu vào CatId-id .... Nó làm việc cho tôi nhiều lần ..

Sửa:


Một thời gian dài khi tôi nhìn lại Tôi nghĩ rằng Tôi biết lý do ngay bây giờ. Words Like Jared là chính xác, tất cả đều liên quan đến Định tuyến mà chúng tôi chỉ định. Nếu tôi có một tuyến đường (mặc định) như:

routes.MapRoute(
     "Default",            // Route name 
     "{controller}/{action}/{id}",       // URL with parameters 
     new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    ); 

Và URL của tôi là /MyController/GetLocationCategory/123, nó sẽ tương đương với /MyController/GetLocationCategory?id=123.

Tương tự, nếu tôi muốn thay đổi tên tham số cho Id để nói CatId, thì tôi cần phải thay đổi tham số chuỗi truy vấn (cách tôi đang gọi Hành động điều khiển của mình sẽ thay đổi).bây giờ mà sẽ là:

/MyController/GetLocationCategory?CatId=123

+3

Điều này đã khắc phục sự cố cho tôi .. Điều đó có nghĩa gì? – wasatchwizard

+4

@wasatchwizard Tôi nghĩ rằng tên đối số của phương thức cần phải khớp với những gì bạn đặt trong tuyến đường của mình, đó là '{id}' trong trường hợp này. –

+0

@WordsLikeJared - Bạn đã chính xác. Tôi đã cập nhật câu trả lời của mình. Tôi hy vọng nó được giải thích một cách chính xác. – Shubh

2

URL yêu cầu của bạn là http://localhost:8598/api/WebApi/GetLocationCategory/87

Tuyến đường của bạn được cấu hình để chấp nhận: 'api/{controller}/{action}/{id}'

Vì vậy, bạn cần đảm bảo rằng tên của bộ điều khiển của bạn là 'WebApiController'.

Ngoài ra, như đã nêu alredy bởi @SDG bạn cần phải chắc chắn rằng tên của tham số để phương pháp hành động của bạn phù hợp với những gì bạn có trong Route của bạn mẫu tức là thay đổi 'CatID' thành 'id'

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

Maps:

http://localhost:8598/api/Controller/Action/id

phần WebApi của url là không cần thiết với api. Sau đó, thay đổi tên tham số phương pháp để phù hợp với lộ trình:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

Đây là một mặc định tốt vì nó phù hợp với Công ước.

Ngoài ra, bạn có thể sửa đổi các tuyến đường sử dụng tên tham số độc đáo này thay vì:

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

Cuối cùng, trong cả hai trường hợp chắc chắn tên điều khiển kết thúc bằng Controller.

tên Tốt: CustomController, CustomApiController
tên Bad: Custom, CustomApi

+1

Tên và tên họ đã giải quyết được sự cố của tôi – Cherry