2014-07-16 4 views
0

У меня есть веб-ASP.NET Апи Содержащие следующие методы: GetДифференцируя Получ Содержит строки запроса в ASP.NET Web API

[RoutePrefix("api/contact")] 
public class ContactController : ApiController 
{ 
    private ContactContext db = new ContactContext(); 

    public IEnumerable<Contact> Get() 
    { 
     return db.Contacts.AsEnumerable(); 
    } 



    [Route("{id:int}")] 
    public Contact Get(int id) 
    { 
     var result = db.Contacts.Find(id); 
     if (result == null) 
     { 


      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
     } 
     return result; 
    } 

    public IEnumerable<Contact> GetContacts([FromUri]Filter filter) 
    { 
     return db.Contacts.Where(c => c.DepartmentId == filter.DepartmentId && c.City == filter.City).ToList(); 
    } 
} 

В функции public IEnumerable<Contact> GetContactsfilter([FromUri]Filter filter) DepartementId & City находятся в строку запроса, как

localhost:12345/api/Contact?DepartmentId=2&city=Mumbai 

Мой вопрос: как добавить атрибутивную маршрутизацию для запроса, потому что В настоящее время он не может различать методы Get и возвращает ошибку

{"Message":"An error has occurred.","ExceptionMessage":"Multiple actions were found that match the request: \r\nSystem.Collections.Generic.IEnumerable`1[MyFirstWebApi.Models.Contact] Get() on type MyFirstWebApi.Controllers.ContactController\r\nSystem.Collections.Generic.IEnumerable`1[MyFirstWebApi.Models.Contact] GetContacts(MyFirstWebApi.Models.Filter) on type MyFirstWebApi.Controllers.ContactController","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"} 

Я попытался добавить атрибут Routing Attribute to Get, содержащий id, но это не сработало.

ответ

2

Маршрутизация атрибутов или регулярная маршрутизация не поддерживают параметры запроса в шаблонах. Вместо этого вы можете изменить свой контроллер, чтобы иметь только два действия, как показано ниже:

// Here if no DepartmentId or City are provided, then the 'filter' parameter would be null 
[Route] 
public IEnumerable<Contact> GetContacts([FromUri]Filter filter) 

[Route("{id:int}")] 
public Contact Get(int id) 
+0

спасибо ... что отличает метод фильтра, но теперь нужно объединить метод Get 'All Contact' с методом фильтра ..... который работает для меня ... но я хочу знать, есть ли способ их отличить ... спасибо! –

+0

@KiranChalla Я столкнулся с той же проблемой. Конкретный ответ был оценен. – lbrahim

Смежные вопросы