您的位置:首页 > 编程语言

关于代码调用SSP获取UserProfile出错的解决方案

2009-08-04 17:21 741 查看
用代码调用MOSS的SSP获取UserProfile时,代码只能运行于MOSS站点下,或者是WinForm中,否则,会出错,这个问题如何解决呢?

代码如下:




SPSite site = new SPSite("http://ssjin073:9031");




//获取上下文环境


ServerContext context = ServerContext.GetContext( site ) ;//.GetContext(sspName);




//this.Context.Items["Microsoft.Office.ServerContext"] = context;





Response.Write(context.Status);




UserProfileManager _profileManager;


_profileManager = new UserProfileManager(context) ;





UserProfile u = _profileManager.GetUserProfile("saictest//zjy");




Response.Write(u.PersonalUrl);

这段代码只能在MOSS站点的页面上运行,如果在普通的站点或者直接在VS的小IIS中运行,会报如下错误:






Error

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->

值不能为空。


参数名: serverContext


说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。




异常详细信息: System.ArgumentNullException: 值不能为空。


参数名: serverContext




源错误:






行 44:


行 45:


行 46: UserProfile u = _profileManager.GetUserProfile("saictest//zjy");


行 47:


行 48: Response.Write(u.PersonalUrl);







源文件: e:/DEV/zjy/MCS Enterprise Solution/MCS Enterprise Solution/SharePoint/MCS.SharePoint.Web/Default.aspx.cs 行: 46




堆栈跟踪:






[ArgumentNullException: 值不能为空。


参数名: serverContext]


Microsoft.Office.Server.SiteContext..ctor(ServerContext serverContext) +79


Microsoft.Office.Server.SiteContext.get_Current() +128


Microsoft.Office.Server.UserProfiles.SRPSite.get_SiteContext() +36


Microsoft.Office.Server.UserProfiles.PropertyDataTypeCollection..ctor(SRPSite site) +264


Microsoft.Office.Server.UserProfiles.SRPSite.get_DataTypes() +48


Microsoft.Office.Server.UserProfiles.UserProfileManager.get_PropertyDataTypes() +58


Microsoft.Office.Server.UserProfiles.UserProfile.Load(SqlDataReader myReader, Boolean bFirstRead, Boolean bWssId) +116


Microsoft.Office.Server.UserProfiles.UserProfile.Load(SqlDataReader myReader) +33


Microsoft.Office.Server.UserProfiles.UserProfile.RetrieveUser(String strAcct, Guid gAcct, Byte[] bSid, Nullable`1 recordId, Boolean doNotResolveToMasterAccount) +703


Microsoft.Office.Server.UserProfiles.UserProfile..ctor(UserProfileManager objManager, String strAcct, Boolean doNotResolveToMasterAccount, Boolean forceUserIsSelf) +329


Microsoft.Office.Server.UserProfiles.UserProfile..ctor(UserProfileManager objManager, String strAcct) +37


Microsoft.Office.Server.UserProfiles.UserProfileManager.GetUserProfile(String strAccountName) +129


_Default.Page_Load(Object sender, EventArgs e) in e:/DEV/zjy/MCS Enterprise Solution/MCS Enterprise Solution/SharePoint/MCS.SharePoint.Web/Default.aspx.cs:46


System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +13


System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +45


System.Web.UI.Control.OnLoad(EventArgs e) +80


System.Web.UI.Control.LoadRecursive() +49


System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3743








这个错误是MOSS的一个bug引起的,SiteContext的内部代码会调用当前上下文中的ServerContext,调用不到,就抱错了。

我们可以通过手工添加上下文对象解决这个问题 :




SPSite site = new SPSite("http://ssjin073:9031");




//获取上下文环境


ServerContext context = ServerContext.GetContext( site ) ;//.GetContext(sspName);




//此处将ServerContext放入上下文


this.Context.Items["Microsoft.Office.ServerContext"] = context;





Response.Write(context.Status);




UserProfileManager _profileManager;


_profileManager = new UserProfileManager(context) ;





UserProfile u = _profileManager.GetUserProfile("saictest//zjy");




Response.Write(u.PersonalUrl);

以上代码在任何站点下都可以运行了!

注意:

1)站点应用程序池的帐号必须有足够的权限,或者直接采用MOSS站点的应用程序池.

2)站点的web.config下需要添加如下配置:




<identity impersonate="true" />

----------

另:提升权限后,操作ListItem也会出现类似的错误,可以用同样的方法解决:




protected void Page_Load(object sender, EventArgs e)






{




SPSecurity.RunWithElevatedPrivileges(delegate()






{


UpdateItem();


}


);


}




void UpdateItem()






{


SPSite site = new SPSite("http://ssjin073:9032");





SPWeb web = site.RootWeb;





//强制设置上下文对象


HttpContext.Current.Items["HttpHandlerSPWeb"] = web;




web.AllowUnsafeUpdates = true;


SPList list = web.Lists["MainList"];




SPListItem item = list.Items[0];




item["Title"] = DateTime.Now.ToString();




item.Update();




web.Dispose();


site.Dispose();


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: