在我们的SharePoint应用程序中,我们将UnitOfWork + Repository模式与Entity Framework一起使用。为了避免使用直通身份验证,我们开发了一段代码,用于在创建ObjectContext
实例之前模拟单个用户,其方式与本网站上“Impersonating user with Entity Framework”中描述的方式类似。
我们的代码和引用的问题之间的唯一区别是,要进行模拟,我们使用RunWithElevatedPrivileges
来模拟应用程序池标识,如下例所示。
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite site = new SPSite(url)) {
_context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
}
});
我们这样做是因为我们希望在模仿后创建ObjectContext
,并且由于存储库正在接收模拟的ObjectContext
,这将解决我们的要求。
不幸的是,这并不容易。实际上我们经历过这样的情况,即使ObjectContext
是在模拟环境之前和之下创建的,真正的连接是在执行查询之前进行的,所以不会使用模拟,这会破坏我们的要求。
我检查了ObjectContext
课程,看看是否有任何事件可以让我们注入模仿,但遗憾的是没有发现任何事件。
任何帮助?
答案 0 :(得分:1)
当我们使用LinqToSharePoint时,我们遇到了类似问题。 DataContext是从HttpContext.Current创建的,并没有考虑RunWithElevatedPrivileges方法。我们做了一个讨厌的解决方法,我们备份了原始的HttpContext,在RunWithElevatedPrivileges方法中创建了一个新的虚拟HttpContext,问题就消失了。显然我们之后将背景设置为原始。
您可以使用以下方法创建新的虚拟HttpContext
。在RunWithElevatedPrivileges中首先调用此方法。在正常情况下,只需使用var backupContext = HttpContext.Current
备份您的当前上下文,并在完成所有操作后重新设置上下文。
private void SetNewContextWeb(SPWeb oWeb)
{
HttpRequest httpRequest = new HttpRequest(string.Empty, oWeb.Url, string.Empty);
HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new System.IO.StringWriter()));
SPControl.SetContextWeb(HttpContext.Current, oWeb);
}