【问题标题】:How to declare a parameter as prefix on OData如何将参数声明为 OData 的前缀
【发布时间】:2015-01-07 19:31:46
【问题描述】:

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

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

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

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

知道这是如何在 OData 中制作的吗?我对它有点陌生,互联网上缺乏这方面的信息。

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

【问题讨论】:

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


    【解决方案1】:

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

    如果你想要更多的灵活性,你可以额外使用路由属性。例如

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

    【讨论】:

      【解决方案2】:

      您的以下代码应该可以工作:

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

      【讨论】:

      • {sessionId} 不应该是静态值。我打算使用 {sessionId} 作为 Guid 参数。例如:localhost/E80DC2C7-3A7E-4E39-8DB1-519EC8E58B4C/Customers/…
      • 我的代码确实有效:D。我发现了愚蠢的错误......我正在测试 Apicontroller 而不是 ODataController。感谢您的帮助!
      【解决方案3】:

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

      config.Routes.MapHttpRoute(
          name: "Sample",
          routeTemplate: "{sessionId}/{controller}"
       );
      
      config.MapODataServiceRoute(
          routeName: "HSODataRoute",
          routePrefix: "{sessionId}/",
          model: GetEdmModel());
      

      我发现这个是因为在我删除 MapHttpRoute 后,我开始出现 404 not found,而当我添加 MapHttpRoute 时可以找到资源。

      更新:

      我为解决此问题而提出的最终解决方案已发布在此处:Pass Parameters in OData WebApi Url

      【讨论】:

      • 我正在尝试做一些与此非常相似的事情:stackoverflow.com/questions/29514873/… 你是如何读出 sessionId 的? HttpContext.Current.Request["sessionId"]; 为我返回 null。
      • 在我浪费了一些时间之后,我遇到了一个解决方案,不确定它是否是最好的,但它确实有效。我忘记更新解决方案了,但我现在就更新。
      猜你喜欢
      • 2013-07-11
      • 2023-03-27
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多