SharePoint 客户端对象模型共用ClientContext的坑

首先请看代码

private static void Main(string[] args)
{
	Test2();
}

private static void Test2()
{
	var clientContext = CreateClientContext();
	var oList = clientContext.Web.Lists.GetByTitle("title");
	var title = "xxxxxx";
	var email = "[email protected]";

	var itemCreateInfo = new ListItemCreationInformation();
	var oListItem = oList.AddItem(itemCreateInfo);
	oListItem["Title"] = title;
	//两个方法的坑
	oListItem["Email"] = GetUserIdByEmail(email); //GetUserIdByEmail(clientContext, email);

	oListItem.Update();
	clientContext.ExecuteQuery();
}

private static int GetUserIdByEmail(string email)
{
	using (var ctx = CreateClientContext())
	{
		var result = Utility.ResolvePrincipal(ctx, ctx.Web, email, PrincipalType.User,
			PrincipalSource.All, null, true);

		ctx.ExecuteQuery();
		if (result != null)
		{
			var user = ctx.Web.EnsureUser(result.Value.LoginName);
			ctx.Load(user);
			ctx.ExecuteQuery();
			return user != null ? user.Id : -1;
		}
	}
	return -1;
}
//错误的方法
private static int GetUserIdByEmail(ClientContext ctx, string email)
{
	var result = Utility.ResolvePrincipal(ctx, ctx.Web, email, PrincipalType.User,
		PrincipalSource.All, null, true);
	ctx.ExecuteQuery();
	if (result != null)
	{
		var user = ctx.Web.EnsureUser(result.Value.LoginName);
		ctx.Load(user);
		ctx.ExecuteQuery();
		return user != null ? user.Id : -1;
	}
	return -1;
}

private static ClientContext CreateClientContext()
{
	var clientContext = new ClientContext("site url")
	{
		Credentials = new NetworkCredential("_userName", "_password", "_domainName")
	};
	return clientContext;
}

代码很简单,就是利用CSOM往列表里插入一条数据。其中列表有个栏是用户或组类型,但用户提供的值是email,所以转成对应的用户ID。

问题的坑在于GetUserIdByEmail()两个重载方法。

其中 GetUserIdByEmail(string email)是正确的,而GetUserIdByEmail(ClientContext ctx, string email)却会导致Title列始终插入不成功。

对比两种方法可以看出,第二种共用的调用处的ClientContenxt,也就是这个问题,导致失败。原因就是此方法内部调用了ctx.ExecuteQuery();

他会提交一次数据到服务器。导致Title列也随之被提交,但是列表此时并未执行Update,所以提交到服务器的数据就失败了。

而真正列表调用clientContext.ExecuteQuery();时,Title列却早已为空了。最终结果就是列表里只插入Email列数据。

时间: 2024-08-15 11:58:55

SharePoint 客户端对象模型共用ClientContext的坑的相关文章

sharepoint 客户端对象模型之日历操作

sharepoint 客户端对象模型对日历的添加和删除操作,完整代码 1 //实例化网站,获取上下文关系 2 ClientContext c = new ClientContext("http://spweb"); 1 //身份验证 2 c.Credentials = new System.Net.NetworkCredential("用户名", "密码", "域"); 1 //获取操作对象 2 Web web = c.Web

Sharepoint客户端对象模型上传附件

Sharepoint2010中引入了客户端对象模型(COM) 来加强外部对sharepoint站点信息的访问(sharepoint2007只能通过web service) SharePoint中有3种客户端对象模型: ECMAScript .NET托管客户端对象模型 Silverlight客户端对象模型 3种客户端对象模型都通过Client.svc来实现与服务器的交互,对于COM在此不做详细的说明,本节的学习目标是:通过客户端对象模型上传附件 在sharepoint常用于存储附件的容器有:Lib

SharePoint 客户端对象模型 多选查阅项赋值

var clientContext = new SP.ClientContext.get_current(); //if the page and the list are in same site.If list is in different site then use relative url instead of get_current var oList = clientContext.get_web().get_lists().getByTitle('Contacts'); var

SharePoint 2013 Silverlight中使用Net客户端对象模型

1.创建Silverlight时,选择Silverlight 4,不要选择版本5,试了很久版本5都调用不了,自己也不知道什么原因,谷歌也没找到答案,后来尝试版本4,可以调用: 至于Host the Silverlight application是否勾选没有影响: 2.Silverlight中使用客户端脚本,和Net中不一样,要添加下面两个引用: 3.两个需要的引用,在服务器上位置为C:\Program Files\Common Files\Microsoft Shared\Web Server

开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发指南>(涂指南这个名字不是白叫的).给大家看一下当年列出来的大纲: SharePoint 2010开发概览 SharePoint 2010基础架构,SharePoint与ASP.NET.IIS的关系 解释服务器场的概念,从硬件拓扑层次解释APP.WFE 解释Web应用程序.网站集.网站.列表和文档库的概

SharePoint 2013 实战碎嘴(ECMAScript客户端对象模型): 提示某个列表不存在

简单情景描述1:(在Sharepoint 2013 Solution 中) 在相应的.aspx页面引入 一下两个.js文件: <script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script> <script type="text/javascript" src="/_layouts/15/sp.js"><

BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--客户端对象模型和REST APIs概览 客户端对象模型API范围

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第9章节--客户端对象模型和REST APIs概览 客户端对象模型API范围 本章之前提到过,客户端对象模型应用中一个不足就是缺乏对SP APIs和访问功能的支持不足.

使用客户端对象模型读取SharePoint列表数据

使用客户端对象模型读取SharePoint列表数据 客户端对象模型提供了强有力的方式,从远程客户端应用程序管理列表. 1. 管理员身份打开VS,新建项目Windows窗体应用程序,命名ReadSPListData,确保选择.NET Framework 3.5. 2. 添加控件. 控件类型: 3. 你必须添加一个类ProductInfo. 4. 双击两个按钮,添加方法.首先是Exit: 5. 然后是Load.首先要添加合适的引用.右击项目,添加引用Microsoft.SharePoint.Clie

使用客户端对象模型回写SharePoint列表

使用客户端对象模型回写SharePoint列表 客户端对象模型是一个有效的方式回写SharePoint列表. 1. 管理员身份打开VS,新建WPF应用程序SPWriteListApp,确保选择.NET Framework 3.5. 2. 添加以下类型控件. 界面如下: 对应代码: 3. 开始编程序之前,必须添加引用 Microsoft.SharePoint.Client.dll 和the Microsoft.SharePoint.Client.Runtime.dll.然后添加 using Cli