Во время некоторых операций чтения/записи/обновления клиентская объектная модель 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;
}