[英]Create CSOM ClientContext with re-usability like singleton pattern
我对使用ClientContext的不同用户操作调用了多种方法。 在每次方法执行时创建它都会导致性能问题。
所以我将它添加为 static 变量以实现可重用性,性能平均提高了 5 秒,但随后在某些方法中它开始在ExecuteQuery()上随机出现“版本冲突”问题。 但是如果我删除 static 和 null 检查,那么它每次都会刷新并且性能成为问题
有没有办法创建一次 object 或至少不是每次调用? ClientContext 的默认到期时间是多少?
创建ClientContext object的代码:
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;
}
}
PS:我没有测试过这段代码,但如果这对你有用
您可以尝试在更新之前加载列表项。 修改代码如下,检查是否有效。
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 用作 static object。在代码中,您正在使用段中编写代码。 ClientContext object 将在using块执行完成后销毁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.