我有一個Web部件訪問SP對象模型,打包在已簽名並部署到GAC的程序集中。 web.config設置爲「完全」信任,但我的Web部件會拋出一個SecurityException
。問題的代碼行:信任已設置爲完整,但Web部分仍導致SecurityException
SPSecurity.RunWithElevatedPrivileges(new SPSecurity.CodeToRunElevated(() =>
{
foreach (SPGroup g in user.Groups)
{
identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
}
}));
看來,當RunWithElevatedPrivileges
是所謂的(換言之,我委託不執行的話)拋出異常。有任何想法嗎?在這一點上,我完全不知所措。
更新:這裏的樣子之前,我把它包在RunWithElevatedPrivileges方法是什麼代碼:
public MyWebPart()
{
context = new MyProject.Data.MyDataContext(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString);
SPUser user = SPContext.Current.Web.CurrentUser;
identity = String.Format("'{0}'", user.LoginName.ToLowerInvariant().Replace(@"\", @"\\"));
foreach (SPGroup g in user.Groups)
{
identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
}
identity = '[' + identity + ']';
}
和異常:
System.Security.SecurityException occurred
Message="Request failed."
Source="Microsoft.SharePoint"
StackTrace:
at Microsoft.SharePoint.SPBaseCollection.System.Collections.IEnumerable.GetEnumerator()
at MyProject.MyWebPart..ctor()
InnerException:
基於由異常助手提供的高亮,它看起來像試圖訪問SPUser.Groups屬性是問題:user.Groups
。
我真的很困惑的是,這個確切的代碼在兩天前工作的很好,但我還有一些其他的問題與農場,基本上不得不重建它。在把所有其他東西都重新備份後,我去了並試圖將這個Web部分添加到一個頁面中,並且這個問題本身就表現出來了。我嘗試在RunWithElevatedPrivileges
包裝中包裝代碼以查看是否可以準確隔離有問題的位,但是看起來接觸SP對象模型的任何東西都會導致異常,包括RunWithElevatedPrivileges
方法。
update2:我仍然不知道這是失敗的真正原因,但是當我嘗試添加Web部件時發生了這種情況。在調試器中設置斷點後,我意識到構造函數被調用兩次;這是第一次,這一切都和預期一致,但第二次是拋出異常的時候。我仍然不知道爲什麼。我發現了兩種解決方法:將違規代碼從構造函數中移出到Web部件生命週期的稍後時間點,或者註釋掉代碼以添加Web部件,然後取消註釋並重新部署。
顯然,這個「3天前工作」的原因是因爲我很久以前將我的web部件添加到頁面,然後將上面的代碼添加到構造函數中。由於網頁部分已經添加,我從來沒有看到任何問題。後來,當我最近不得不重建網站並再次將網頁部分添加到頁面時,這個問題就體現出來了。所以從技術上說,它之前沒有「工作」,我只是沒有做出讓它變得不合適的事情。
無論如何,就像我說的 - 我仍然不知道異常的真正原因,所以仍然歡迎回答這些問題。
將代碼移出Web部件的構造函數幫助我解決了類似問題。感謝您更新問題。 – 2011-09-30 11:38:01
任何人都知道爲什麼把它從構造器中移出來工作? – xdhmoore 2012-04-19 15:06:31