Как объявить параметр в качестве префикса на OData

Используя обычный ApiController в WebApi, я создал следующий код для определения шаблона маршрута динамической карты для каждого ApiController:

config.Routes.MapHttpRoute(
        name: "Sample",
        routeTemplate: "{sessionId}/{controller}"
     );

Я хочу добиться аналогичного поведения, но для каждого ODataController. Я пробовал следующий код, но он не работает:

 config.MapODataServiceRoute(
        routeName: "HSODataRoute",
        routePrefix: "{sessionId}/",
        model: GetEdmModel());

Любая идея, как это сделано в OData? Я в некотором роде новичок в этом, и в Интернете не хватает информации об этом.

Чтобы быть более конкретным: {sessionId} должен быть не константой, а параметром со значением Guid.

3 ответа

Решение

После нескольких тестов я обнаружил, что объявления MapODataServiceRoute недостаточно! Вам также необходимо добавить MapHttpRoute, поскольку ODataController является производным от ApiController.

config.Routes.MapHttpRoute(
    name: "Sample",
    routeTemplate: "{sessionId}/{controller}"
 );

config.MapODataServiceRoute(
    routeName: "HSODataRoute",
    routePrefix: "{sessionId}/",
    model: GetEdmModel());

Я обнаружил это, потому что после того, как я удалил MapHttpRoute, я начал получать 404 не найденным, и когда я добавил MapHttpRoute, ресурс мог быть найден.

ОБНОВИТЬ:

Окончательное решение, которое я нашел, чтобы решить эту проблему, было размещено здесь: Параметры передачи в OData WebApi Url.

ODataConventionModelBuilder по умолчанию отображает маршрут /{controller} на контроллер, чье имя {controller}Controller, Например, это автоматически маршруты /Products в ProductsController пока ProductsController происходит от ODataController,

Если вы хотите большей гибкости, вы можете дополнительно использовать атрибуты маршрутизации. Например

[ODataRoutePrefix("Products")]
public class Products : ODataController

Ваш следующий код должен работать:

config.MapODataServiceRoute(
        routeName: "HSODataRoute",
        routePrefix: "{sessionId}/",
        model: GetEdmModel());

Однако вы должны убедиться, что запрос Uri содержит только одну "/". Например:

Отправить запрос на получение как:

http://localhost/{sessionId}/Customers/Default.PrintDate(date=2014-10-24T01:02:03+08:00)

мой ответ:

{
  "@odata.context":"http://localhost/%7BsessionId%7D/$metadata#Edm.String",
  "value":"10/24/2014 1:02:03 AM +08:00"
}

Куда, PrintDate это пользовательская функция привязки к коллекции клиентов.

[HttpGet]
public string PrintDate(DateTimeOffset date)
{
    return date.ToString();
}
Другие вопросы по тегам