将OData QueryString过滤器解析为对象,删除过滤器并创建新路径

时间:2015-10-23 09:28:38

标签: c# odata httprequest

我正在创建一个OData服务,并在我的视图中添加了一个“虚拟”列,它总是返回一个空字符串。这样,当我拦截我的传入请求时,我可以向我的请求头添加一些数据。

我必须这样做,因为我有一些服务的消费者无法提供自定义的RequestHeaders,但可以应用这个额外的OData过滤。

现在要完成此操作,我搜索查询字符串的那一部分并提取我想要的部分并用空字符串替换它。这个解决方案工作正常,但看起来并不优雅。

我开始为查询字符串的过滤器部分编写自己的词法分析器/解析器,但实现起来似乎过于复杂,并且非常错误。

我已经查看了Microsoft Odata命名空间,看看我是否可以找到任何可用的帮助器/解析器来将我的过滤器转换为某种对象图,但没有识别任何对象。

如何在我的服务器上转换此过滤器部分,以便我可以安全地删除1个过滤器表达式并重新编译我的过滤器以再次构建请求路径。

我目前的代码:

void Application_BeginRequest(Object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    string path = app.Context.Request.Url.PathAndQuery;

    var filter = "TokenValue%20eq%20%27";
    int pos = path.IndexOf(filter);
    if (pos > -1)
    {
        var query = path.Substring(0, pos + filter.Length);
        var filterpart = path.Substring(pos + filter.Length, path.Length - pos - filter.Length);
        var delimitedpart = "%27";
        var t = filterpart.IndexOf(delimitedpart);
        var tokenValue = filterpart.Substring(0, t);
        app.Context.Request.Headers["CustomToken"] = tokenValue;
        filterpart = filterpart.Substring(t, filterpart.Length - t);

        path = query + filterpart;
        app.Context.RewritePath(path);
    }
}

0 个答案:

没有答案