C# 拦截OData“;查询「;
我想“截取”/更改将OData与Web API一起使用时生成的OData查询。。但我不完全确定如何“提取”生成的查询。。我假设OData过滤器会展开,然后生成某种表达式树或某种查询。。如果是这样的话,那么这就是我希望在将其作为SQL命令发送到数据库之前能够修改的查询类型 我在网上搜索了一些方法来提取生成的表达式树。。但是还没有找到足够的信息,所以我希望这里的人能对整个OData“框架”的工作原理有更多的了解C# 拦截OData“;查询「;,c#,.net,asp.net-web-api,odata,C#,.net,Asp.net Web Api,Odata,我想“截取”/更改将OData与Web API一起使用时生成的OData查询。。但我不完全确定如何“提取”生成的查询。。我假设OData过滤器会展开,然后生成某种表达式树或某种查询。。如果是这样的话,那么这就是我希望在将其作为SQL命令发送到数据库之前能够修改的查询类型 我在网上搜索了一些方法来提取生成的表达式树。。但是还没有找到足够的信息,所以我希望这里的人能对整个OData“框架”的工作原理有更多的了解 您知道从哪里开始吗?您可以在ODataURL执行之前更改它。从EnableQueryAt
您知道从哪里开始吗?您可以在ODataURL执行之前更改它。从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
给我们看看你有什么tried@Inx51运气好吗?