Как объявить параметр в качестве префикса на 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();
}