【问题标题】:WCF Data Service with custom filter带有自定义过滤器的 WCF 数据服务
【发布时间】:2011-11-30 17:08:12
【问题描述】:

我首先使用 WCF 数据服务和实体框架 4.1 代码创建服务。我需要根据 uri 段进行一些过滤。基本上,我们有一个多租户数据库,需要要求将租户 id 的字符串表示形式作为 uri 的一部分传递。例如,一个 uri 看起来像这样:

http://myservice.com/client123/Users

然后,Client123 将用于创建仅针对该客户端数据的上下文过滤。

我被指向http://www.odata.org/developers/odata-sdk 的 OData 示例代码的方向,我看到使用 sessionid 创建和缓存默认数据的代码(我也添加了会话管理的逻辑)。但是,使用 DSPContext 等完成的方式似乎对于基于实体框架的实现来说不需要很多。 (至少我的理解是,如果您使用的是实体框架,则不需要创建自定义上下文。)

有人知道使用基于标准实体框架的数据源进行此类实现的好例子吗?或者,您能给我建议如何修改现有的 sdk 代码吗?我主要被困在元数据创建(这甚至需要吗?)和资源创建上。

提前致以最诚挚的问候和感谢!

【问题讨论】:

  • 我真的很坚持这个。我也尝试通过注册服务路由来实现这条路由。问题在于服务路线似乎不支持占位符。请帮忙! :-D

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


【解决方案1】:

如果您使用的是基于 EF 的服务,无论客户端 ID 是什么,服务看起来总是一样的,那么您不需要任何花哨的自定义提供程序。只需使用 SDK 中的技巧来获取正确的客户端 ID,公开基于“普通”EF 的 WCF DS 服务并在 DataService.CreateDataSource 覆盖中使用客户端 ID 为该客户端创建正确的 EF 上下文。

【讨论】:

  • 感谢您的快速回复。然后我会做一个 uritemplate 匹配来提取 id 并传递它吗?我认为(知道)我遗漏了一些应该很明显的东西。
  • 在您覆盖 CreateDataSource 时,您需要以某种方式获取客户端 ID。有几种方法(取决于您的确切主机)。一种方法是检查请求 URI 并从那里获取它。另一个可能是 SDK 示例在会话中使用的技巧。
  • 我能够通过使用 uriteplate 并获取 boundparameter 来获得我需要的东西。但是,我仍然得到一个找不到 client123 的资源。
  • 您是否调试过 404 的来源?只需附加一个调试器并让它在所有异常时停止。 404 将在某个时候作为异常抛出。
  • 是的,我确实尝试在所有异常集上使用 break 进行调试,但我没有收到任何中断。我认为正在发生的是它试图找到一个不存在的 EF 资源 Client123。我是否需要以某种方式从 URL 中删除它?对不起,我是这个路由的新手。
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2020-06-11
  • 2012-04-24
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多