如何在OData上声明参数作为前缀

时间:2015-01-07 19:31:46

标签: c# routes odata asp.net-web-api maproute

在WebApi中使用普通的ApiController,我制作了以下代码来为每个ApiControllers定义动态地图路径模板:

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

我希望为每个ODataController实现类似的行为。 我已经尝试了以下代码,但它不起作用:

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

知道如何在OData中进行此操作吗?我有点新手,互联网上缺乏相关信息。

更具体地说:{sessionId}不应该是常量,而是具有Guid值的参数。

3 个答案:

答案 0 :(得分:1)

ODataConventionModelBuilder默认将路由/{controller}映射到名称为{controller}Controller的控制器。例如。只要/Products派生自ProductsController,它就会自动将ProductsController路由到ODataController

如果您想要更多灵活性,还可以使用路由属性。 E.g。

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

答案 1 :(得分:1)

您的以下代码应该有效:

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

但是,您应该确保请求Uri包含只有一个" /"。 例如:

我发送一个Get请求:

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();
}

答案 2 :(得分:1)

经过几次测试后,我发现声明MapODataServiceRoute是不够的! 你还需要添加MapHttpRoute,因为ODataController派生自ApiController

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

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

我发现这是因为在我删除MapHttpRoute之后,我开始找不到404,当我添加MapHttpRoute时,可以找到资源。

<强>更新

我已经找到了解决此问题的最终解决方案:Pass Parameters in OData WebApi Url