【问题标题】:Intercept the OData "query"拦截 OData“查询”
【发布时间】:2017-02-15 05:39:40
【问题描述】:

我想“拦截”/更改在将 OData 与 Web API 一起使用时生成的 OData 查询。但我不完全确定如何“提取”生成的查询。我假设 OData 过滤器,扩展和更多一些如何生成某种表达式树或某种查询..如果是这种情况,那么这就是我希望能够在将其作为 SQL 发送到数据库之前更改的查询类型-命令。

我已经在网上搜索了一些提取生成的表达式树的方法..但无法找到足够的信息,所以我有点希望这里有人对整个 OData-"框架”的作品..

有什么想法可以从哪里开始吗?

【问题讨论】:

  • 向我们展示您的尝试
  • @Inx51 运气好吗?

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


【解决方案1】:

您可以在执行之前更改 Odata url。从 EnableQueryAttribute 类继承并更改 url。以下是在发送到 oracle 之前将 guid 字符串格式更改为十六进制字符串格式的真实案例。

public class EnableQueryForGuid : EnableQueryAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var url = actionContext.Request.RequestUri.OriginalString;

        var newUrl = ModifyUrl(url);

        actionContext.Request.RequestUri = new Uri(newUrl);
        base.OnActionExecuting(actionContext);
    }

    private string ModifyUrl(string url)
    {
        Regex regex = new Regex(@"%27([A-Za-z0-9]{32})%27");
        var res = regex.Matches(url);
        if (res.Count > 0)
        {
            var guidPart = res[0].Value.Remove(0, 3);
            guidPart = guidPart.Remove(guidPart.Length - 3, 3);
            var guidValue = new Guid(BitConverter.ToString((new Guid(guidPart)).ToByteArray()).Replace("-", ""));
            url = url.Replace(res[0].Value, guidValue.ToString());
        }
        return url;
    }
}

然后在你的控制器方法上使用这个新属性:

    [HttpGet]
    [EnableQueryForGuid]
    [ODataRoute("GetSomething")]
    public IHttpActionResult GetSomething()
    {
      ....
    }

原始查询:

OData/GetSomething?&$filter=MyGuid%20eq%20%272C3C7BC0EC7FA248B0DEE3DAA371EE73%27

更改的查询:

OData/GetSomething?&$filter=MyGuid%20eq%20e5794d6a-5db1-475a-8c49-0f91a8f53c8a

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2021-10-05
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2023-03-23
    • 2022-01-13
    相关资源
    最近更新 更多