Кто-нибудь пытался программно преобразовать тип файла мультимедиа в EPiServer?
У нас есть тип, который мы смоделировали для изображений, ImageFile, и тип, который был добавлен через плагин. Мы не используем тип, добавленный плагином, но обнаружили, что время от времени загружаемые изображения будут создаваться как неправильный тип. Я надеюсь выяснить, как выполнить преобразование, чтобы я мог запустить запланированное задание, выполнить пакетное преобразование их всех, а затем удалить плагин.
Пока что я могу программно сделать копию A типа B, а затем удалить A. Что я действительно хотел бы сделать, так это преобразовать A в B для плавного перехода.
Первое, что я попробовал, - это клонирование изображения как правильного типа, но это имеет значение null
var media = _contentRepository.Service.GetDescendents(SiteDefinition.Current.GlobalAssetsRoot)
.Where(i => _contentRepository.Service.Get<IContent>(i) is MediaData);
var imageFileTypeId = new ImageFile().ContentTypeID;
foreach (var img in media)
{
if (img.Get<IContent>() is GcEpiImageFile)
{
count++ // for summary
var item = _contentLoader.Service.Get<GcEpiImageFile>(img.Get<IContent>().ContentLink);
var cloneItem = item.CreateWritableClone() as ImageFile;
if (cloneItem == null)
{
var msg = $"{item.Name}: {item.ContentLink.ID} came up null";
OnStatusChanged(msg);
summaryMessage.AppendLine(msg);
continue;
}
cloneItem.ContentTypeID = imageFileTypeId;
_contentRepository.Service.Save(cloneItem, SaveAction.Publish, AccessLevel.NoAccess);
}
Следующее, что я попробовал, это клонирование его как базового класса ImageData, который, кажется, создает объект но выдает ссылку на объект, не установленную для экземпляра исключения объекта при сохранении.
var media = _contentRepository.Service.GetDescendents(SiteDefinition.Current.GlobalAssetsRoot)
.Where(i => _contentRepository.Service.Get<IContent>(i) is MediaData);
var imageFileTypeId = new ImageFile().ContentTypeID;
foreach (var img in media)
{
if (img.Get<IContent>() is GcEpiImageFile)
{
count++ // for summary
var item = _contentLoader.Service.Get<GcEpiImageFile>(img.Get<IContent>().ContentLink);
var cloneItem = item.CreateWritableClone() as ImageData;
if (cloneItem == null)
{
var msg = $"{item.Name}: {item.ContentLink.ID} came up null";
OnStatusChanged(msg);
summaryMessage.AppendLine(msg);
continue;
}
try
{
cloneItem.ContentTypeID = imageFileTypeId;
}
catch (Exception ex)
{
summaryMessage.AppendLine($"exception triggered by id assignment {ex.Message}<br />{ex.InnerException}");
}
try
{
_contentRepository.Service.Save(cloneItem, SaveAction.Publish, AccessLevel.NoAccess);
}
catch (Exception ex)
{
summaryMessage.AppendLine(
$"exception triggered by save {ex.Message}<br />{ex.InnerException}");
}
}
Вот мой след стека:
Object reference not set to an instance of an object.
at EPiServer.Validation.Internal.RoutingSegmentValidator.Validate(IContent instance) at
EPiServer.Validation.Internal.ContextValidatorWrapper`2.Validate(Object instance, Object context)
at EPiServer.Validation.Internal.ValidationService.ValidateRecursively(Object instance, Object context, HashSet`1 visitedInstances)
at EPiServer.Validation.Internal.ValidationService.Validate[T](Object instance, T context)
at EPiServer.Core.ContentProvider.Validate(IContent content, ContentSaveValidationContext saveValidationContext)
at EPiServer.Core.Internal.DefaultContentRepository.Save(IContent content, SaveAction action, AccessLevel access) at Web.Business.ScheduledJobs.ImageConversion.Execute()
Любые мысли, помощь, руководство будет очень оценили