拦截OData“查询”

时间:2016-10-06 12:56:20

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

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

我在网上搜索了一些提取生成的表达式树的方法..但是无法找到足够的信息,所以我有点希望这里有人能更深入地了解整个OData-“框架“工作..

任何从哪里开始的想法?

1 个答案:

答案 0 :(得分:0)

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

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