【问题标题】:OData v4 unbound function with custom routing具有自定义路由的 OData v4 未绑定函数
【发布时间】:2017-05-20 05:03:19
【问题描述】:

我创建了一个“实用程序”控制器,它没有绑定到任何模型并且只包含未绑定的函数。
我希望能够通过如下网址调用它:
odata/Utilities/SomeMethod()

现在我必须这样称呼它:
odata/SomeMethod()

如何为“实用程序”创建自定义路由?

我试过了:

[ODataRoutePrefix("Utilities")]
public class UtilitiesController : ODataController

我也试过了:

[ODataRoute("Utilities/SomeMethod()"]
public string SomeMethod()

但是这两个都会抛出一个错误:
“控制器 'Utilities' 中操作 'SomeMethod' 的路径模板 'Utilities/SomeMethod()' 不是有效的 OData 路径模板。找不到段 'Utilities' 的资源。”

【问题讨论】:

    标签: asp.net-web-api odata asp.net-web-api-routing odata-v4


    【解决方案1】:

    您可以覆盖默认控制器选择器来实现此目的。您可以像这样创建一个继承自 DefaultHttpControllerSelector 的新类:

    public class CustomControllerSelector : DefaultHttpControllerSelector
    {
    
        public override string GetControllerName(HttpRequestMessage request)
        {
            string controllerName = null;
            // I haven't tested this, but here you can decide whether you want to 
            //  route to your new controller or not
            if (request.ODataProperties().Path.PathTemplate == "~/UnboundFunction")
            {
                controllerName = "UtilitiesController";
            }
            else
            {
                controllerName = base.GetControllerName(request);
            }
    
            return controllerName;
        }
    }
    

    然后你可以像这样替换控制器选择器:

    config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector());
    

    这让您可以选择在运行时为每个请求使用哪个控制器

    【讨论】:

    • 这不起作用。如果您尝试调用 URL“/odata/Utilities/SomeMethod()”,您将收到 500 内部服务器错误。如果您尝试调用“/odata/SomeMethod()”,那么它将进入 CustomControllerSelector,但一旦进入,它就不会路由到正确的控制器。您将收到“未找到与名为 UtilitiesController 的控制器匹配的类型”。控制器确实存在。此外,这仍然不会让您拥有我正在尝试做的“/odata/Utilities/SomeMethod()”。
    【解决方案2】:
    1. 定义控制器类:

      public class UtilitiesController : ODataController
      {
          [System.Web.Http.HttpGet]
          [ODataRoute("SomeMethod")]
          public string SomeMethod()
          {
              // add your code
          }
      }
      
    2. 绘制路线:

      var config = new HttpConfiguration();
      
      var modelBuilder = new ODataConventionModelBuilder();
      
      modelBuilder.Function("SomeMethod").Returns<string>();
      
      config.MapODataServiceRoute("ODataRoute", "odata/Utilities", modelBuilder.GetEdmModel());
      

    【讨论】:

    • 这将修改所有当前的 OData 路由。我只想为 Utilities 控制器添加一个新的自定义路由。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2018-07-05
    • 2016-01-06
    • 2014-10-08
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多