使用针对SharePoint 2010/2013客户端对象模型的反射来读取.net中的私有变量是否安全?

使用针对SharePoint 2010/2013客户端对象模型的反射来读取.net中的私有变量是否安全?,sharepoint,sharepoint-2010,sharepoint-2013,system.reflection,sharepoint-clientobject,Sharepoint,Sharepoint 2010,Sharepoint 2013,System.reflection,Sharepoint Clientobject,在某些读/写/更新操作期间,SharePoint客户端对象模型返回“(503)服务不可用”异常,请重新尝试解决此问题。 这里,重试操作创建了一个新的返回值集合,我们无法将其分配回原始返回值对象 注意:LoadQuery()方法的返回值出现在“ClientQueryableResult.m_data”私有变量中 我们给出了下面的反射代码。但问题是,我们不确定将反射与SharePoint客户端对象模块一起使用以读取其中一个私有变量值是否安全 e、 g.加载我们拥有的SharePoint组 var g

在某些读/写/更新操作期间,SharePoint客户端对象模型返回“(503)服务不可用”异常,请重新尝试解决此问题。 这里,重试操作创建了一个新的返回值集合,我们无法将其分配回原始返回值对象

注意:LoadQuery()方法的返回值出现在“ClientQueryableResult.m_data”私有变量中

我们给出了下面的反射代码。但问题是,我们不确定将反射与SharePoint客户端对象模块一起使用以读取其中一个私有变量值是否安全

e、 g.加载我们拥有的SharePoint组

var groups = _ClientContext.LoadQuery(_ClientContext.Web.SiteGroups);

_ClientContext.ExecuteQuery();
下面的代码缓存LoadQuery()参数,并在重新尝试的异常情况下使用它

object OrgResult, NewResult, Params;
    Params = clientObjects
    OrgResult = _ClientContext.LoadQuery(clientObjects);
    try   {_ClientContext.ExecuteQuery();}
    catch (WebException webEx){
    NewResult = _ClientContext.LoadQuery(Params);
    _ClientContext.ExecuteQuery();
    object data = NewResult.GetPrivateFieldValue("m_data");
    if (data != null)
        OrgResult.SetPrivateFieldValue("m_data", data);
    }

    // Reflection method to read private value
    public static object GetPrivateFieldValue(this object src, string fieldName)
    {
    object value = null;
    FieldInfo fieldInfo = src.GetType().GetField(fieldName, BindingFlags.NonPublic
                                                |BindingFlags.Instance);
    if (fieldInfo != null)
    value = fieldInfo.GetValue(src);
    return value;
    }

使用基于反射的代码总是不安全的,因为它可能会在将来的SharePoint升级中中断。您有两种选择:

  • 使用它的风险自负。任何升级或补丁都可能破坏它

  • 找出问题的根本原因。您的意思是,重新尝试计算表达式会成功。您应该能够重构您的设计,使其在向用户放弃错误之前总是尝试读取两次

  • 我经常使用客户机对象模型,但没有遇到这个问题。因此,我宁愿你走2号线。但是,如果你真的遇到了一些现在还不能解决的罕见问题,那就走路线1