2013-05-13 27 views
5

İlk ASP.NET web API'mı oluşturuyorum. Standart REST URL'lerini takip etmeye çalışıyorum. API'm arama sonucu kayıtlarını döndürürdü. Ben arama ve IIS üzerinde Basic/Özet kimlik için OData kullanmayı planlıyorumWeb API İç İçe Aktarılan Kaynak URL'de

../api/categories/{categoryId}/subcategories/{subCategoryId}/records?SearchCriteria

- My URL olmalıdır. Sorunum iç içe kaynaklarda. Arama sonuçlarını döndürmeden önce, kullanıcının bu kategoriye ve alt kategoriye erişip erişmediğini kontrol etmem gerekiyor. Artık Visual Studio 2012 - MVC4/Web API projemi başlattım. App_Start klasöründe, URL'nin kaynak ile ilgili olduğuna inandığım 2 dosya var. Benim URL ../api/records?SearchCriteria ama eğer

1.RouteConfig.cs

routes.MapRoute(
name: "Default", 
url: "{controller}/{action}/{id}", 
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

2.WebApiConfig.cs

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

, iyi çalışıyor yukarıda belirtilen URL tasarımım değil. Anladığım kadarıyla biraz daha fazla okuma yapmak zorundayım ama şu ana kadar doğru makaleyi bulamıyorum. URL'ye nasıl ulaşacağınız ve bu 2 dosyada hangi değişikliklere ihtiyaç duyulduğuna dair tavsiyenize ihtiyacınız var. Alternatif olarak, burada eksik olduğum başka bir yapılandırma var mı? Şimdiden teşekkürler.

cevap

2

var varsayarsak kategoriler, Kişisel WebApiConfig.cs (Ben şahsen /kayıtları kısmı kapalı bırakacaktı) istediğiniz url maç için böyle bir yol olabilir adında bir kontrolör:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{categoryId}/subcategories/{subCategoryId}", 
    defaults: new { controller = "categories", categoryId = somedefaultcategory, 
     subCategoryId = RouteParameter.Optional } 
); 

// search a single subcategory 
public IQueryable<SearchRecord> Get(int categoryId, int subCategoryId = 0, string SearchCriteria = "") 
{   
    // test subCategoryId for non-default value to return records for a single 
    // subcategory; otherwise, return records for all subcategories 
    if (subCategoryId != default(int)) 
    { 
    } 
} 

Ama ayrıca sadece kategori ve alt kategorileri değil dönmek ne isterseniz: ve bir yöntem bu gibi görünür? 2 kutudan yönlendirme Özellik sağlar

// search a single category 
public IQueryable<SearchRecord> Get(int categoryId, string SearchCriteria = "") 
{ 
} 
// search all categories 
public IQueryable<SearchRecord> Get(string SearchCriteria = "") 
{ 
} 
3

Asp.net Web API: gibi iki yöntem ile

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

: Daha genel olduğu ilkinden sonra ek rotayı gerekiyordu. Route'u bireysel eylem yöntemiyle veya global düzeyde tanımlayabilirsiniz.

Örn: Web içinde yönlendirme Özelliği hakkında daha fazla bilgi için this bağlantıyı ziyaret edebilirsiniz

[RoutePrefix("api/books")] 
public class BooksController : ApiController 
{ 
    // GET api/books 
    [Route("")] 
    public IEnumerable<Book> Get() { ... } 

    // GET api/books/5 
    [Route("{id:int}")] 
    public Book Get(int id) { ... } 
} 

: Ayrıca [RoutePrefix] özelliğini kullanarak bütün bir denetleyici için ortak bir önek ayarlayabilirsiniz

[Route("customers/{customerId}/orders/{orderId}")] 
public Order GetOrderByCustomer(int customerId, int orderId) { ... } 

API 2.

İlgili konular