【问题标题】:Intercept the OData "query"拦截 OData“查询”
【发布时间】:2017-02-15 05:39:40
【问题描述】:
我想“拦截”/更改在将 OData 与 Web API 一起使用时生成的 OData 查询。但我不完全确定如何“提取”生成的查询。我假设 OData 过滤器,扩展和更多一些如何生成某种表达式树或某种查询..如果是这种情况,那么这就是我希望能够在将其作为 SQL 发送到数据库之前更改的查询类型-命令。
我已经在网上搜索了一些提取生成的表达式树的方法..但无法找到足够的信息,所以我有点希望这里有人对整个 OData-"框架”的作品..
有什么想法可以从哪里开始吗?
【问题讨论】:
标签:
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