拦截OData“查询” - c#

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

我已经在网上搜索了某种提取生成的表达式树的方法..但无法找到足够的信息,所以我希望这里的人对整个OData-“框架”的工作原理有更多的了解。 ..

关于从哪里开始的任何想法?

参考方案

您可以在执行前更改Odata网址。从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

ASP.NET Web API 2中AuthorizeAttribute发生了什么变化? - c#

我已经将项目和一组单元测试从ASP.NET Web API升级到ASP.NET Web API 2。我们将自定义DelegatingHandler用于自定义身份验证机制。它将Thread.CurrentPrincipal和HttpContext.Current.User设置为适当的System.Security.Claims.ClaimsPrincipal。…

将多个对象从Angular控制器发布到Web API 2 - c#

我能够从我的角度控制器发送原始json对象,该对象在我的Web api方法中反序列化为已知类型。很好,但是我现在需要能够在同一请求中发送其他参数,这些参数可以是json对象或简单类型,例如string或int。我看过诸如this之类的文章,它们准确地描述了我的问题,但是它们是从代码隐藏而不是客户端发送请求的。我试图构造一个json数组并将其发送进去,但收到以…

调用SignalR Hub不适用于Asp.Net Core Web API - c#

我是SignalR的新手。我正在尝试设置一个Asp.Net Core WebAPI,以便其他客户端可以使用SignalR连接到它并获取实时数据。我的Hub类是:public class TimeHub : Hub { public async Task UpdateTime(string message) { await Clients.All.SendAs…

Web API中的电子邮件确认 - c#

我有Web API应用程序,并且想要实现电子邮件确认。现在,我有了采用address的方法-客户端主机,它将位于回调URL uriBuilder中,并将由用户从邮件中打开:public async Task<IdentityResult> RegisterAsync(string email, string userName, string pa…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……