用代码调用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
值不能为空。
参数名: 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();
    }

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

  1. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  2. php执行跟踪_PHP使用debug_backtrace方法跟踪调试代码调用详解

    本文实例讲述了PHP使用debug_backtrace方法跟踪调试代码调用.分享给大家供大家参考,具体如下: 在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到 ...

  3. 为所有服务器端代码调用ConfigureAwait的最佳实践

    本文翻译自:Best practice to call ConfigureAwait for all server-side code When you have server-side code ( ...

  4. python打开摄像头获取图片_Python基于opencv调用摄像头获取个人图片的实现方法

    接触图像领域的应该对于opencv都不会感到陌生,这个应该算是功能十分强劲的一个算法库了,当然了,使用起来也是很方便的,之前使用Windows7的时候出现多该库难以安装成功的情况,现在这个问题就不存在 ...

  5. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )

    文章目录 一. ActivityThread 中的 installProvider 方法 ( 创建 ContentProvider 内容提供者 ) 二. installProvider 方法的第三分支 ...

  6. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application )

    文章目录 一. ContentProvider 创建过程分析 二. ActivityThread 中的 H 处理 BIND_APPLICATION 消息 三. ActivityThread 中的 ha ...

  7. php 利用debug_backtrace方法跟踪代码调用

    在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调 ...

  8. java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...

    1首先是如何在自己的app里用网页显示,这样可以较快的更新界面而不需要让客户端升级,方法如下: xml文件: android:layout_width="fill_parent" ...

  9. java获取本机ip地址_代码片段:获取系统所有IP

    问题 在Windows系统中,可以支持多个网卡,比如有线的以太网卡,无线网卡,虚拟网卡等.如下图所示: 每一张网卡由不同的类型,也可以分别被用户启用或禁用. 对于单独一张给定的网卡,其IP地址可以是D ...

最新文章

  1. 初步了解Windows Safer API
  2. linux kernel浮点处理
  3. bert模型中的[CLS]、[UNK]、[SEP]
  4. Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法
  5. 大数据思维是企业互联网化的思维内核
  6. 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
  7. loading窗口动画 web_在页面未加载完之前显示loading动画
  8. 在Linux下写一个简单的驱动程序
  9. 10g的客户端从9i的服务器中导出数据时遇到上面的问题
  10. 玩转接口测试,那些必备的技能
  11. vs2012中对于entity framework的使用
  12. Django日志模块logging的配置详解
  13. Linux下mail服务配置(RHEL5)
  14. AC010笔记之三:总结
  15. 天涯明月刀罗技鼠标自由弹奏脚本
  16. 图像检索:基于内容的图像检索技术
  17. java netbeans_Java初学者学习Netbeans介绍
  18. Java-汉字字符串转拼音,包括首字母和全拼
  19. 如何设置默认浏览器?快速学会,简单易懂
  20. HBase数据库使用TTL清理过期数据

热门文章

  1. 共享端口445能改吗_模玩控:高达模型改圣斗士星矢五小强,大家能认出它们都是机体吗?...
  2. 8个JavaScript题目
  3. linux3.8内核下载,linux 3.8内核usbmouse代码注释
  4. Oracle数据库基本操作
  5. 用Eclipse制作博客
  6. Docker 快速安装 Mysql
  7. linux下无线网卡安装debian,Debian/Linux下无线网卡驱动的安装,网卡型号是「BCM43228」...
  8. 绿米开关如何重置_开个灯还带音效?跟我学简单改装智能开关,保证按上瘾!...
  9. jfinal-layui中如果sql是多表时条件查询写法
  10. layui引入jQuery