Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

Set cache policy with the new media system

Vote:
 

With the old VPP system you could create and register a StaticFileHandler and override the cache policy, like this:

public class CdnStaticFileHandler : StaticFileHandler
{
    protected override void SetCachePolicy(HttpContext context, DateTime fileChangedDate)
    {
        context.Response.Cache.SetExpires(DateTime.UtcNow.AddYears(1));
        // ...and other cache headers
    } 
}

I'm not able to get this to work with the new media system. Is there a way to achieve the same result with the new media system? Preferably a way with access to the IContent object.

#81073
Feb 09, 2014 22:13
Vote:
 

As far as I know you can register handler by implementing a template for particular content type

public class CustomMediaFileHandler : StaticFileHandler, IRenderTemplate<CustomMediaFile>
{
    protected override void SetCachePolicy(HttpContextBase context, DateTime fileChangedDate)
    {
        var routeHelper = ServiceLocator.Current.GetInstance<ContentRouteHelper>();
        var content = routeHelper.Content;

    

 

Haven't played with following setup - so you should test it out.

#81075
Feb 09, 2014 23:51
Vote:
 

I ended up trying something like

    [TemplateDescriptor(Inherited = true, TemplateTypeCategory = TemplateTypeCategories.HttpHandler)]
    public class ImageHandler : ContentMediaHttpHandler, IRenderTemplate<ImageFile>
    {
        protected override void SetCachePolicy(HttpContextBase context, DateTime fileChangedDate)
        {
            // Stuff
        }
    }

but that just results in "Ambiguous match found." without any sensable stack trace. :/

#81078
Edited, Feb 10, 2014 2:03
Vote:
 

Yes, unfortunately you cannot inherit from ContentMediaHttpHandler and at the same time implement IRenderTemplate for particular media content type. Try to inherit from BlobHttpHandler and implement GetBlob on your own:

public class SamplePdfHandler : BlobHttpHandler, IRenderTemplate<PdfFile>
{
    protected override Blob GetBlob(HttpContextBase httpContext)
    {
        var customRouteData = httpContext.Request.RequestContext.GetCustomRouteData<string>(DownloadMediaRouter.DownloadSegment);
        if (!string.IsNullOrEmpty(customRouteData))
        {
            httpContext.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", customRouteData));
        }

        var binary = ServiceLocator.Current.GetInstance<ContentRouteHelper>().Content as IBinaryStorable;
        return binary == null ? null : binary.BinaryData;
    }

    protected override void SetCachePolicy(HttpContextBase context, DateTime fileChangedDate)
    {
        base.SetCachePolicy(context, fileChangedDate);
    }
}

    

#81084
Feb 10, 2014 9:51
Vote:
 

Worked great, thanks!

#81120
Feb 10, 2014 18:19
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.