2012-01-18 1 views
0

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

ЭТО РАБОТАЕТ ИСПЫТАНИЕ КОГДА ВХОДИТ В СИСТЕМУ ADMIN!

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 пространства имен, строка encodingStyle, String ID) в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter XMLWriter, Object о) на Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml (XmlWriter писатель, XMLSerializer XMLs, Boolean shouldSerializeAll) в Microsoft .SharePoint.WebPartPages.WebPart.WriteXmlAsBytes (XMLSerializer XMLs) при Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlGlobal (Boolean disableSafeControlsCheck) при Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize (PersonalizationScope охват) на Microsoft.SharePoint .WebPartPages.BinaryWebPartSerializer.get_Links() по адресу Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore (WebPart WebPart, Int32 viewId, String viewGuid) на Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal (SPSupersetWebPart надмножеству, Boolean throwIfLocked) в Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager. AddWebPartInternal (WebPart WebPart, Строка ZoneId, Int32 zoneIndex, булева throwIfLocked) при Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart (WebPart WebPart, Строка ZoneId, Int32 zoneIndex) при admSitePanelSolution.admSiteCreateCollection. <> c_ DisplayClasse.b _c()

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

в Microsoft.SharePoint .SPGlobal.HandleUnauthorizedAccessException (UnauthorizedAccessException ех) в Microsoft.SharePoint.Library.SPRequest.GetViewsSchemaXml (String bstrUrl, String bstrListName, Boolean bFullBlown, ISP2DSafeArrayWriter p2DWriter, Int32 & plDefaultViewIndex) в Microsoft.SharePoint.SPViewCollection.EnsureViewSchema (Boolean fullBlownSchema) в Microsoft.SharePoint.SPViewCollection..ctor (список SPList) в Microsoft.SharePoint.SPList.get_Views() в Microsoft.SharePoint.SPList. get_DefaultView() в Microsoft.SharePoint.SPList.get_DefaultViewUrl() в Microsoft.SharePoint.WebPartPages.ListViewWebPart.ShouldSerializeDetailLink() на Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write9_ListViewWebPart (String н, String нс, ListViewWebPart о, булевой IsNullable, булева needType) на Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart (Объект o)

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

UPDATE

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

ответ

0

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

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

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

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