SharePoint - клонирование веб-частей с сайта шаблона на новый сайт - ошибка XML - PullRequest
0 голосов
/ 18 января 2012

Не уверен, с чего начать.У меня есть настройки кода для создания нового сайта, а затем скопировать внешний вид, списки и веб-части с сайта шаблона.

ЭТО РАБОТАЕТ ХОРОШО, КОГДА ВХОДИЛ В СИСТЕМУ АДМИНИСТРАЦИИ!

foreach (Microsoft.SharePoint.WebPartPages.WebPart webPartTemplate in webPartCollectionTemplate)
{
  try
  {
MemoryStream memoryStream = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
webPartManagerTemplate.ExportWebPart(webPartTemplate, xmlWriter);
xmlWriter.Flush();
memoryStream.Flush();
memoryStream.Position = 0;

XmlTextReader xmlReader = new XmlTextReader(memoryStream);

Microsoft.SharePoint.WebPartPages.ListViewWebPart listViewWebPartTemplate = null;
Microsoft.SharePoint.WebPartPages.ListViewWebPart listViewWebPartTarget = null;
Microsoft.SharePoint.WebPartPages.WebPart webPartTarget = null;

bool webPartIsListViewWebPart = false;

// If it throws an exception, the web part is not a ListViewWebPart
try
{
  listViewWebPartTemplate = (ListViewWebPart)webPartTemplate;
  webPartIsListViewWebPart = true;
}
catch { }

if (webPartIsListViewWebPart)
{
  string errorMessage = "";
  listViewWebPartTarget = (Microsoft.SharePoint.WebPartPages.ListViewWebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage);

  if (errorMessage != null)
    // log it

  // Drop the brackets from the Guid and create a Guid object from the string. Then use it to find the list so we can get the title.
  SPList listTemplate = webTemplate.Lists[new Guid(listViewWebPartTemplate.ListName.ToString().TrimStart('{').TrimEnd('}'))];
  SPList listTarget = webTarget.Lists[listTemplate.Title];

  listViewWebPartTarget.ListName = listTarget.ID.ToString("B").ToUpper();
  listViewWebPartTarget.WebId = webTarget.ID;
  listViewWebPartTarget.TitleUrl = webPartTemplate.TitleUrl.ToString().Replace(siteTemplate.ServerRelativeUrl, siteTarget.ServerRelativeUrl);
  listViewWebPartTarget.Title = webPartTemplate.Title;
  listViewWebPartTarget.ZoneID = webPartTemplate.ZoneID;

  webPartDictTarget.Add(listViewWebPartTarget.ZoneID + webPartTemplate.ZoneIndex.ToString(), listViewWebPartTarget);
}
else
{
  string errorMessage = "";
  webPartTarget = (Microsoft.SharePoint.WebPartPages.WebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage);

  if (errorMessage != null)
    // log it

  webPartTarget.ChromeType = webPartTemplate.ChromeType;
  webPartTarget.TitleUrl = webPartTemplate.TitleUrl.ToString().Replace(siteTemplate.ServerRelativeUrl, siteTarget.ServerRelativeUrl);
  webPartTarget.Title = webPartTemplate.Title;
  webPartTarget.ZoneID = webPartTemplate.ZoneID;

  webPartDictTarget.Add(webPartTarget.ZoneID + webPartTemplate.ZoneIndex.ToString(), webPartTarget);
}
  }
  catch (Exception ex)
  {
  }
}

// Acquire keys and sort them.
List<string> list = new List<string>(webPartDictTarget.Keys);
list.Sort();

// Loop through keys.
int i = 0;
foreach (var key in list)
{
  try
  {
    Microsoft.SharePoint.WebPartPages.WebPart wpTmp = (Microsoft.SharePoint.WebPartPages.WebPart)webPartDictTarget[key];
    webPartManagerTarget.AddWebPart(wpTmp, wpTmp.ZoneID, i);
  }
  catch (Exception ex)
  {
  }
  i++;
}

Ошибка выдается в следующей строке:

webPartManagerTarget.AddWebPart(wpTmp, wpTmp.ZoneID, i);

Трассировка стека следует {"Произошла ошибка при создании документа XML."}:

в System.Xml.Serialization.XmlSerializer.Serialize (пространства имен XmlWriter xmlWriter, Object o, XmlSerializerNamespaces, String encodingStyle, String) в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xml)Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml (писатель XmlWriter, XmlSerializer xmls, логическое mustSerializeAll) в Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlAsBytes (XmlSerializer xmls)SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize (область действия PersonalizationScope) at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.get_Links () в Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore (WebPart webPart, Int32 viewId, строковый viewGuid) в Microsoft.SharePoint.WebPartPartНеобязательный DisplayClasse.b _c ()

И InnerException {"Доступ запрещен.(Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) "}:

в Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException (исключение UnauthorizedAccessException) в Microsoft.SharePoint.Library.SPRequest.NestStringBringStation, Boolean bFullBlown, ISP2DSafeArrayWriter p2DWriter, Int32 & plDefaultViewIndex) в Microsoft.SharePoint.SPViewCollection.EnsureViewSchema (логическое fullBlownSchema) в Microsoft.SharePoint.SPViewCollection..SP.SharePoint.SP (список SPListPoint) в Microsoft.SharePoint.SPViewCollection..SP (список SPListPoint) в Microsoft (S)SPList.get_DefaultView () в Microsoft.SharePoint.SPList.get_DefaultViewUrl () в Microsoft.SharePoint.WebPartPages.ListViewWebPart.ShouldSerializeDetailLink () в Microsoft.Xml.Serialization.isNullable, Boolean needType) в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart (Object o)

Может ли кто-нибудь помочь понять, почему это происходит, когда вы не вошли в систему как системный администратор.Весь этот блок также работает с повышенными привилегиями, а SPSite и SPWeb также были созданы внутри повышенного блока.Этот код является выдержкой.

ОБНОВЛЕНИЕ

Если я сделаю пользователя владельцем семейства сайтов базового семейства сайтов, то приведенный выше кодработает нормально.Так что в приведенном выше коде сбрасывает контекст или должен ссылаться на базовое семейство сайтов.Спасибо.

1 Ответ

0 голосов
/ 19 января 2012

И мой коллега нападает, чтобы спасти день! В SP dev есть хорошо известный хак, который часто используется, когда разрешения становятся странными и глупыми. Это аннулирует HttpContext. Я пробовал это вокруг строки и цикла, что вызывало у меня проблему, но, кажется, вам нужно поместить это намного выше в код во время импорта.

Вот новое исправление.

HttpContext currentContext = HttpContext.Current;
HttpContext.Current = null;
listViewWebPartTarget = (Microsoft.SharePoint.WebPartPages.ListViewWebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage);
HttpContext.Current = currentContext;

Этот код теперь работает для копирования веб-частей с одной страницы APSX на другую. Надеюсь, это кому-нибудь поможет.

...