学习:关于代码调用SSP获取UserProfile出错的解决方案(转)

 

 

1、用代码调用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;

UserProfileManager _profileManager;       

_profileManager = new UserProfileManager(context) ;

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

Response.Write(u.PersonalUrl);

 

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

 

Error

值不能为空。

参数名: serverContext

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

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

参数名: serverContext

源错误:

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

47:

48:        Response.Write(u.PersonalUrl);

 

这个错误是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;

        UserProfileManager _profileManager;       

       _profileManager = new UserProfileManager(context) ;

  

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

       Response.Write(u.PersonalUrl);

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

 

注意:

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

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

<identity impersonate="true" />

 

2、提升权限后,操作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();

}

 

文章来源:http://www.cnblogs.com/jianyi0115/archive/2008/04/11/1148827.html

原文地址:https://www.cnblogs.com/LeimOO/p/1551627.html