2015-07-23 21 views
11

Hem GUID hem de tamsayı için GET yollarını nasıl destekleyebilirim? GUID'lerin ideal olmadığının farkındayım, ama şimdilik bunun için var. Kullanıcıların, 'un benzersiz "anahtarlar" olması gerektiğini hatırlamasını ve iletmesini kolaylaştırmak için tamsayılar için destek eklemek istiyorum.Web API Rotaları hem GUID hem de tamsayı kimliklerini desteklemek için

Örnek yolları:

testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1 
testcases/1234 

Benim WebApiConfig:

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 
    var routes = config.Routes; 

    routes.MapHttpRoute("DefaultApiWithAction", 
     "Api/{controller}/{action}"); 

    routes.MapHttpRoute("DefaultApiWithKey", 
     "Api/{controller}/{key}", 
     new { action = "Get" }, 
     new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), key = @"^\d+$" }); 

    routes.MapHttpRoute("DefaultApiWithId", 
     "Api/{controller}/{id}", 
     new { action = "Get" }, 
     new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }); 

    routes.MapHttpRoute("DefaultApiGet", 
     "Api/{controller}", 
     new { action = "Get" }, 
     new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }); 

    routes.MapHttpRoute("DefaultApiPost", 
     "Api/{controller}", 
     new { action = "Post" }, 
     new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }); 
} 

My kontrolör (yöntem imzalar için):

[RoutePrefix("Api/TestCases")] 
public class TestCasesController : PlanControllerBase 
{ 
    [Route("")] 
    public OperationResult<IEnumerable<TestCaseDTO>> Get([FromUri] TestCaseRequest request) 

    [Route("{id}")] 
    [HttpGet] 
    public OperationResult<TestCaseDTO> Get(Guid id) 

    [Route("{key}")] 
    [HttpGet] 
    public OperationResult<TestCaseDTO> Get(int key) 

    ... 
} 

Bir iç sunucu hatası alıyorum Kullanarak kaynağı aramayı deniyorum tamsayı. Herhangi bir yardım takdir edilir!

+0

Bir dize alan ve bazı denetimler yapan tek rota? –

+2

Bu cevaba bir bakın: http://stackoverflow.com/questions/14353466/overload-web-api-action-method-based-on-parameter-type –

cevap

15

@SirwanAfifi'ye teşekkürler! Bahsettiğiniz SO sorusunda atıfta bulunulan Attribute Routing in ASP.NET makalesine rastladım, ama görünüşte o sırada rota öznitelik kısıtlamalarına gereksinim duymadım.

Benim için, hile yapan denetleyici yöntemlerimde [Route("{id:guid}")] ve [Route("{key:int}")] kullanıyordum. Ayrıca, denetleyicideki özniteliklerin yönlendirmeyi yapmaktan sorumlu olduğunu doğrulamak için WebApiConfig numaralı telefonumda {id} ve {key} ile ilgili Http yollarını açıkladım.