Assets Migration and VPP



I'm using a legacy system to move content across to a EPiServer CMS 8. These are my configuration to register a virtual path:

When I try to access provider with this code:

 var provider = VirtualPathHandler.GetProvider("ProtectedModules") as VirtualPathNonUnifiedProvider;

(Gives /EPISERVER/ as virtualPathroot and is mapped correctly with physical path.)

I get full details of the provider, but as I try to do this operation:

var isVpp = VirtualPathHandler.Instance.IsVirtualPath(provider.virtualPathRoot); //returns false

foreach (var Map in VirtualPathHandler.Instance.NameToVirtualPathMapping) //returns count 0

What am I doing wrong. Any help is much appreciated. Thanks in advance.

Mar 22, 2016 4:35

Try use the new way for virtual path providers instead with the VirtualPathRegistrationHandler

Get this class from ioc by ServiceLocator and use the RegisteredVirtualPathProviders property to get your provider and settings.

I hope that gives you better responses :)

Edited, Mar 22, 2016 9:11

Thanks a ton for the reply @Daniel. This at least gives me a direction to dig forward. I actually have a weird requirement. The company's got a legacy software that performs a site migration to an EPiServer CMS site through the use of web services. As EPi has moved to Service API from webservices, my scene has become more complicated. On top of that, I don't have access to that software source code. All I'm doing is playing with the webservices to insert assets into EPi. At the moment, all I need is to push the assets (images and files), which I have in my database, to the EPi library through the use of VPP.

Thank you for your answer, I'll have a look at new way as you suggested.


Mar 22, 2016 10:26

Couldn't get much out of that article. Could you please provide me with some code reference?? Thanks in advance.


Mar 23, 2016 0:43

Ok for images and files and Episerver 8 you should actually no longer use vpp. Vpp are still used in 7.5+ but not for assets like images and files etc. From 7.5 and up all images and files etc are stored as any other content. So you can store files now in a similar way that you earlier created content.

1. Create your media content types that you want to use.

using System;
using System.ComponentModel.DataAnnotations;
using EPiServer.Core;
using EPiServer.DataAbstraction;
using EPiServer.DataAnnotations;
using EPiServer.Framework.DataAnnotations;
namespace MyEpiserverSite.Models.Media
    [ContentType(DisplayName = "GenericMedia", GUID = "89761dbb-bf22-4cee-93c7-9d661d75cad8", Description = "Used for generic file types such as Word or PDF documents.")]
    [MediaDescriptor(ExtensionString = "pdf,doc,docx")]
    public class GenericMedia : MediaData
                    Name = "Description",
                    Description = "Add a description of the content.",
                    GroupName = SystemTabNames.Content,
                    Order = 1)]
                public virtual String Description { get; set; }

Check out

2. Get your file from database and store it as one of the media types above 

public void Uploading_a_media_from_extension()
var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
var mediaDataResolver = ServiceLocator.Current.GetInstance<ContentMediaResolver>();
var blobFactory = ServiceLocator.Current.GetInstance<BlobFactory>();

//Get a suitable MediaData type from extension
var mediaType = mediaDataResolver.GetFirstMatching(".txt");
var contentType = contentTypeRepository.Load(mediaType);

//Get a new empty file data
var media = contentRepository.GetDefault<MediaData>(SiteDefinition.Current.GlobalAssetsRoot, contentType.ID);
media.Name = "Readme.txt";

//Create a blob in the binary container
var blob = blobFactory.CreateBlob(media.BinaryDataContainer, ".txt");
using (var s = blob.OpenWrite())
StreamWriter w = new StreamWriter(s);
w.WriteLine("Hello world");

//Assign to file and publish changes
media.BinaryData = blob;
var file1ID = contentRepository.Save(media, SaveAction.Publish);

Alternatively use the new rest api to insert media if you don't have access to the source of the new site. Code example below

using (var client = new HttpClient())
    client.BaseAddress = new Uri("");
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    var content = new MultipartFormDataContent();
    var filestream = new FileStream(path, FileMode.Open);
    content.Add(new StreamContent(filestream), "file", "Media.xml");
    var response = client.PostAsync("/episerverapi/commerce/import/assets", content).Result;
    if (response.StatusCode == HttpStatusCode.OK)
        var returnString = response.Content.ReadAsStringAsync().Result;
        returnString = returnString.Replace("\"", "");
        Guid taskId = Guid.Empty;
        Guid.TryParse(returnString, out taskId);
using an xml structure to describe the asset to import similar to 
  <MediaType name="pdf">
    <ContentType>Customer.Website.ContentTypes.PdfData, Customer.Website</ContentType>

Read more about that here

Edited, Mar 23, 2016 9:10

You are a legend mate. Thank you so much. I will try to make necessary adjustments to accomodate the changes. Thanks for baring.

CHeers, Bikram.

Mar 23, 2016 11:12
This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.