Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拦截OData“;查询「;_C#_.net_Asp.net Web Api_Odata - Fatal编程技术网

C# 拦截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

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

我在网上搜索了一些方法来提取生成的表达式树。。但是还没有找到足够的信息,所以我希望这里的人能对整个OData“框架”的工作原理有更多的了解


您知道从哪里开始吗?

您可以在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运气好吗?