用代码调用MOSS的SSP获取UserProfile时,代码只能运行于MOSS站点下,或者是WinForm中,否则,会出错,这个问题如何解决呢?
代码如下:
这段代码只能在MOSS站点的页面上运行,如果在普通的站点或者直接在VS的小IIS中运行,会报如下错误:
这个错误是MOSS的一个bug引起的,SiteContext的内部代码会调用当前上下文中的ServerContext,调用不到,就抱错了。
我们可以通过手工添加上下文对象解决这个问题 :
以上代码在任何站点下都可以运行了!
注意:
1)站点应用程序池的帐号必须有足够的权限,或者直接采用MOSS站点的应用程序池.
2)站点的web.config下需要添加如下配置:
----------
另:提升权限后,操作ListItem也会出现类似的错误,可以用同样的方法解决:
代码如下:
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);
//获取上下文环境
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
这个错误是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);
//获取上下文环境
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();
}
{
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();
}