API развертывания и миграции контента не импортирует никаких ошибок
-
09-12-2019 - |
Вопрос
Следующее http://blogs.technet.com/b/stefan_gossner/archive/2007/08/30/deep-dive-into-the-sharepoint-content-deployment-and-migration-api-part-4.aspx предоставляет следующий код для импорта и экспорта элемента с помощью API развертывания и миграции контента.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Deployment;
namespace WssOMtest
{
class Program
{
static void Main(string[] args)
{
// export
SPSite site = new SPSite("http://localhost:4000");
SPWeb web = site.OpenWeb("/");
SPList list = web.Lists["MyList"];
SPListItem listItem = list.Items[0];
SPExportObject exportObject = new SPExportObject();
exportObject.Id = listItem.UniqueId;
exportObject.Type = SPDeploymentObjectType.ListItem;
SPExportSettings exportSettings = new SPExportSettings();
exportSettings.ExportObjects.Add(exportObject);
exportSettings.FileLocation = @"c:\export\CopyListItem";
exportSettings.FileCompression = false;
exportSettings.SiteUrl = "http://localhost:4000";
SPExport export = new SPExport(exportSettings);
export.Run();
web.Dispose();
// import
SPImportSettings importSettings = new SPImportSettings();
importSettings.SiteUrl = "http://localhost:4000";
importSettings.FileLocation = @"c:\export\CopyListItem";
importSettings.FileCompression = false;
importSettings.RetainObjectIdentity = false;
SPImport import = new SPImport(importSettings);
EventHandler<SPDeploymentEventArgs> startedEventHandler = new EventHandler<SPDeploymentEventArgs>(OnStarted);
import.Started += startedEventHandler;
import.Run();
// cleanup
site.Dispose();
}
// event handler to assign a new parent to the orphaned image in the package
static void OnStarted(object sender, SPDeploymentEventArgs args)
{
SPSite site = new SPSite("http://localhost:4000");
SPWeb web = site.OpenWeb("/PressReleases");
SPList list = web.Lists["TargetList"];
SPImportObjectCollection rootObjects = args.RootObjects;
foreach (SPImportObject io in rootObjects)
{
io.TargetParentUrl = list.RootFolder.ServerRelativeUrl;
}
web.Dispose();
site.Dispose();
}
}
}
Ок, отлично.Я изменил настройки, чтобы они использовали имена моих списков и URL-адрес моего сайта.Экспорт работает отлично.Импорт не работает.Я выполняю код в документе lib.Никаких ошибок не возникает, но элемент содержимого не меняет список.
Что может пойти не так?Даже если я удалю исходный элемент после экспорта, а затем выполню импорт без изменения родительского списка, ничего не произойдет.
Решение
Я протестировал ваш код и обнаружил, что проблема заключалась в том, что файлы, созданные во время экспорта, не были должным образом очищены на локальном диске.Я реализовал логику удаления файлов, чтобы обеспечить правильную работу экспорта и импорта.Обратите внимание: я запускал экспорт и импорт с и без FileCompression
и оба работают нормально.Я провел тест на двух библиотеках изображений.
Извините, у меня не было много времени, чтобы улучшить ваш код, например.правильное размещение объектов SPWeb и SPSite.Надеюсь, вы сделаете это сами.
Обновленный код вставлен ниже:
class Program
{
static void Main(string[] args)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// implementation details omitted
SPSite site = new SPSite("http://mylocaldev/");
SPWeb web = site.OpenWeb("/");
SPList list = web.Lists["ParentPic"];
SPListItem listItem = list.Items[0];
try
{
//delete the old files
DirectoryInfo dir = new DirectoryInfo(@"c:\export\CopyListItem");
foreach (System.IO.FileInfo file in dir.GetFiles()) file.Delete();
// export
SPExportObject exportObject = new SPExportObject();
exportObject.Id = listItem.UniqueId;
exportObject.Type = SPDeploymentObjectType.ListItem;
SPExportSettings exportSettings = new SPExportSettings();
exportSettings.ExportObjects.Add(exportObject);
exportSettings.FileLocation = @"c:\export\CopyListItem";
exportSettings.FileCompression = false;
//exportSettings.BaseFileName = "exportfile.cmp";
exportSettings.SiteUrl = "http://mylocaldev/";
SPExport export = new SPExport(exportSettings);
export.Run();
}
catch (Exception ex)
{
}
finally { web.Dispose();}
// import
SPImportSettings importSettings = new SPImportSettings();
importSettings.SiteUrl = "http://mylocaldev/";
importSettings.FileLocation = @"c:\export\CopyListItem";
importSettings.FileCompression = false;
//importSettings.BaseFileName = "exportfile.cmp";
importSettings.RetainObjectIdentity = false;
SPImport import = new SPImport(importSettings);
EventHandler<SPDeploymentEventArgs> startedEventHandler = new EventHandler<SPDeploymentEventArgs>(OnStarted);
import.Started += startedEventHandler;
import.Run();
// cleanup
site.Dispose();
});
}
// event handler to assign a new parent to the orphaned image in the package
static void OnStarted(object sender, SPDeploymentEventArgs args)
{
SPSite site = new SPSite("http://mylocaldev/");
SPWeb web = site.OpenWeb("/");
SPList list = web.Lists["ChildPic"];
SPImportObjectCollection rootObjects = args.RootObjects;
foreach (SPImportObject io in rootObjects)
{
io.TargetParentUrl = list.RootFolder.ServerRelativeUrl;
}
web.Dispose();
site.Dispose();
}
}
Другие советы
К счастью, незадолго до нескольких дней я работал над похожими задачами.
Я пробовал с вашим данным кодом.и почти его работа.
Но я согласен с @falak, который вы должны написать код с помощью правильной попытки / catch и с шариком SharePoint стандартной кодировки.
Здесь я обнаружил, что, как только ваш код будет работать идеально, второй раз, когда вы должны получить ошибку, потому что вы не чистите свой
Это может помочь вам.