【问题标题】:WCF Data services conditional query interceptorWCF 数据服务条件查询拦截器
【发布时间】:2012-07-26 19:11:11
【问题描述】:

我有一个 wcf 数据服务,我的组织内的应用程序正在使用它。它包含以下实体:

Client
User
Membership

数据被设置为多租户,目前需要我们称之为客户端字符串或客户端唯一 ID 的字符串表示形式作为路径的一部分传入,我将其提取并添加在查询拦截器中作为过滤器。直到最近,当我们有一个新客户加入时,这一直很有效,他的父客户字符串有很多孩子。因此,结果是一个查询,其中包含作为“in (.....)”为所有查询传入的 clientids 列表。还不错,但是当这个客户端现在尝试查询成员资格时,他们传入了 9k+ 个客户端 ID。结果查询在单独执行时似乎运行得相当快,但整个 db 事务持续花费 >30 秒。

如果提供了特定的用户 ID,我最终希望找到一种方法来绕过此类查询的此过滤器。网址如下所示:

http://service.com/clienta/Users(1234)/memberships

如果为用户或会员提供了特定的 ID,我可以避免过滤器,因为它有效地实现了相同的最终结果。我们不能拥有这样的人:

http://service.com/clienta/memberships

没有任何过滤器。

我意识到这可能是分散的,需要更多细节,因为这有点仓促。请提出任何问题。非常感谢任何帮助或指导。

【问题讨论】:

    标签: c# c#-4.0 wcf-data-services


    【解决方案1】:

    是否可以使用查询拦截器来拦截请求,然后如果满足您的条件以避免过滤,则直接忽略它?

    您也可以转到服务方法并传入您的参数,然后做任何您想做的事情。

    【讨论】:

    • 如果我不能创建像条件拦截器这样更全面的方法,那几乎就是我的后备计划。我想我将不得不走那条路。您是否碰巧知道是否有一种简单的方法可以确定是否提供了 id?我可以使用正则表达式,但如果框架中有一个机制来指定它,我宁愿避免这种情况。感谢您的回复!
    • 使用服务方法,您可以从客户端传递您想要的任何内容。它可能是您想要的主要参数。然后你可以检查参数是否为空,然后从那里开始。
    • 对于一个query intecepter route,你是无权访问query string的。对于query interceptor,现在想想,不知道能不能抢到请求 url 以便我可以看到参数,我相信拦截器纯粹添加了额外的 url 参数。但是,如果您知道哪些用户遇到了该问题,您可以使用查询拦截器检查活动用户,然后在 url 中添加更多过滤器以限制他们的记录,让没有问题的用户正常继续。与此类似:bondigeek.com/blog/2010/09/06/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多