创建具有类似singleton模式的可重用性的CSOM ClientContext



在使用ClientContext的不同用户操作上调用了多个方法。在每次执行方法时都创建它会导致性能问题。

因此,我将其添加为可重用的静态变量,性能平均提高了5秒,但在某些方法中,它开始在ExecuteQuery((上随机发出"版本冲突">。但是,如果我删除静态和空检查,那么它每次都会刷新,性能就会成为一个问题

有没有办法创建一个这样的时间对象,或者至少不是在每次调用时创建?ClientContext的默认过期时间是什么?

创建ClientContext对象的代码:

public class SPConnection
{
public static ClientContext SharepointClientContext { get; set; }
public static ClientContext GetSharePointContext()
{
try
{
if (SharepointClientContext == null)
{
string appId = System.Configuration.ConfigurationManager.AppSettings["appId"];
string appSecret = System.Configuration.ConfigurationManager.AppSettings["appSecret"];
string siteUrl = System.Configuration.ConfigurationManager.AppSettings["siteUrl"];
var authManager = new OfficeDevPnP.Core.AuthenticationManager();
using (ClientContext clientContext = authManager.GetAppOnlyAuthenticatedContext(siteUrl, appId, appSecret))
{
SharepointClientContext = clientContext;
return clientContext;
}
}
else
return SharepointClientContext;
}
catch (Exception ex)
{
iChange.Web.API.Authentication.SPConnection.InsertRecordToTableErrorLog("Mucebat:"+ex.Message, ex.StackTrace.ToString());
throw ex;
}
}

使用它的方法之一的代码:

public bool UpdateProfilePic(updateprofilepicmodel model)
{
using (ClientContext context = SPConnection.GetSharePointContext())
{
List list = context.Web.Lists.GetByTitle("Members");
ListItemCreationInformation info = new ListItemCreationInformation();
ListItem item = list.GetItemById(model.MemberId);
item["ProfilePicture"] = model.ProfilepicUrl;
item.Update();
context.ExecuteQuery();
return true;
}
}

您可以尝试将ExecuteQueryAsync与异步任务结合使用以提高性能吗?例如

public async Task <bool> UpdateProfilePic(updateprofilepicmodel model)
{
using (ClientContext context = SPConnection.GetSharePointContext())
{
List list = context.Web.Lists.GetByTitle("Members");
ListItem item = list.GetItemById(model.MemberId);
context.Load(item);
Task t1 = context.ExecuteQueryAsync();
await t1.ContinueWith((t) =>
{
item["ProfilePicture"] = model.ProfilepicUrl;
item.Update();
Task t2 = context.ExecuteQueryAsync();
});
await t2.ContinueWith((t) =>
{
// do some stuff here if needed
});
return true;
}
}

p.S:我还没有测试过这个代码,但如果这对你有效的话,

您可以在更新列表项之前尝试加载。按以下方式修改代码以检查它是否有效。

public bool UpdateProfilePic(updateprofilepicmodel model)
{
using (ClientContext context = SPConnection.GetSharePointContext())
{
List list = context.Web.Lists.GetByTitle("Members");
ListItem item = list.GetItemById(model.MemberId);
context.Load(item);
context.ExecuteQuery();
item["ProfilePicture"] = model.ProfilepicUrl;
item.Update();
context.ExecuteQuery();
return true;
}
}

如果上面的代码不起作用,您可以在列表设置中启用"成员"列表的版本,以检查问题是否仍然存在。

不能将ClientContext用作静态对象。在代码中,您正在Using段中编写代码。一旦我们使用块的执行完成,ClientContext对象就会被销毁。

相关内容

  • 没有找到相关文章

最新更新