Безопасно ли использовать Reflection для клиентской объектной модели SharePoint 2010/2013 для чтения частной переменной в .net?

Во время некоторых операций чтения/записи/обновления клиентская объектная модель SharePoint возвращает исключение «(503) Служба недоступна», повторите попытку решения этой проблемы. Здесь операция повторной попытки создает новую коллекцию возвращаемых значений, и мы не можем присвоить ее обратно исходному объекту возвращаемого значения.

Примечание. Возвращаемое значение метода LoadQuery() присутствует в приватной переменной ClientQueryableResult.m_data.

Мы придумываем приведенный ниже код отражения. Но проблема в том, что мы не уверены, безопасно ли использовать Reflection с модулем объекта SharePoint Client для чтения одного из значений его частной переменной?

например Загрузка групп 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;
    }



Ответы (1)


Использование кода, основанного на отражении, всегда небезопасно, так как это может привести к поломке при будущих обновлениях SharePoint. У вас есть 2 варианта:

  1. Используйте его на свой страх и риск. Любое обновление или патч может сломать его.

  2. Выясните первопричину проблемы. Вы говорите, что повторная попытка оценить выражение приводит к успеху. Вы должны иметь возможность реорганизовать свой дизайн таким образом, чтобы он всегда пытался прочитать дважды, прежде чем сообщить об ошибке пользователю.

Я много использовал клиентскую объектную модель и не сталкивался с этой проблемой. Поэтому я бы предпочел, чтобы вы пошли по пути 2. Но если вы действительно застряли с какой-то редкой проблемой, которую нельзя решить сейчас, пойдите по пути 1.

person Madhur Ahuja    schedule 01.04.2014