2015-05-03 2 views
1

У меня есть следующий код, и я не могу заставить имя действия работать или что-то еще не так? Я хочу создать пользовательский поиск, где обычно, когда вы ищете один объект в api, вы ищете идентификатор, но я бы хотел, например, искать рабочий день, но это действительно может быть что угодно.Маршрутизация веб-API не работает должным образом (имена действий)

DayController.cs:

[ActionName("Weekday")] 
public IHttpActionResult GetDayWeek(string q_day) { 
    var day = controller.GetDay(q_day); 
    if (day == null) { 
     return NotFound(); 
    } 
    return Ok(day); 
} 

Controller.cs:

public Day GetDay(string q_day) { 
    var day = dal.GetDayByWeekday(q_day); 
    return day; 
} 

Dal.cs:

public Day GetDayByWeekday(string q_day) { 
    var day = db.Day.Where(d = > d.Weekday == q_day).Single(); 
    return day; 
} 

WebApiConfig.cs:

public static void Register(HttpConfiguration config) { 
    config.MapHttpAttributeRoutes(); 

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

Ошибка:

<Error> 
    <Message> 
No HTTP resource was found that matches the request URI 'http://localhost:2096/api/Day/Weekday/monday'. 
</Message> 
    <MessageDetail> 
No action was found on the controller 'Day' that matches the request. 
</MessageDetail> 
</Error> 
+0

Im не мастер с Web API - но у попытаться добавить атрибут [HttpPost] методу, а? и убедитесь, что вы выполняете post-request из javascript? – CoBolt

+0

Я думаю, что я должен был бы проверить api без каких-либо js, например, «/ api/Day/Weekday/monday»? – btmach

+0

Да, так же, как вы убедитесь, что его POST-запрос, а не GET/PUT/DELETE-запрос – CoBolt

ответ

2

Изменение этого:

[ActionName("Weekday")] 
public IHttpActionResult GetDayWeek(string q_day) { 
    var day = controller.GetDay(q_day); 
    if (day == null) { 
     return NotFound(); 
    } 
    return Ok(day); 
} 

Для этого:

[Route("api/day/weekday/{q_day}")] 
public IHttpActionResult GetDayWeek(string q_day) { 
    var day = controller.GetDay(q_day); 
    if (day == null) { 
     return NotFound(); 
    } 
    return Ok(day); 
} 

ли трюк в моем тестировании

Некоторые Заслуга JLevett заставила меня искать по атрибуту Route-атрибут

Чтобы пояснить:

Атрибут Route переопределяет путь к методу, который вы пытаетесь вызвать. Поэтому он должен быть полным путем с именами параметров в нем.

У вас есть метод с несколькими параметрами, это должно работать:

[Route("api/day/weekday/{q_day}/{w_day}")] 
public IHttpActionResult GetDayWeekAndMore(string q_day, string w_day) { 
... 
Смежные вопросы