EPiWiki.se  - EPiServer notes shared with others
 

LoggingVirtualPathVersioningProvider

[Edit]
A simple versioned virtual path provider that logs every method access to it, with arguments and return value.

Installation


Add the assembly TestProviders.dll to the sites bin/ folder.

web.config


Change the value of the versioned VPP "type" you want to investigate to "TestProviders.LoggingVirtualPathVersioningProvider, TestProviders"
Example:

<add showInFileManager="false"
     virtualName="Page Files"
     virtualPath="~/PageFiles/"
     bypassAccessCheck="false"
     indexingServiceCatalog="Web"
     physicalPath="%EPISERVERFILESDIR%\r2sp2\PageFiles"
     name="SitePageFiles"
     type="TestProviders.LoggingVirtualPathVersioningProvider,TestProviders" />

EPiServerLog.config


Add a logger TestProviders.LoggingVirtualPathVersioningProvider to the sites log configuration.

<logger name="TestProviders.LoggingVirtualPathVersioningProvider">
  <level value="ALL" />
</logger>

Source code



using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.Hosting;
using EPiServer.Security;
using EPiServer.Web;
using EPiServer.Web.Hosting;
using log4net;
using System.Runtime.Remoting;
using System.Web.Caching;
using System.Collections;
using System.Security.Principal;

namespace TestProviders
{
    public class LoggingVirtualPathVersioningProvider
        : VirtualPathVersioningProvider
    {
        private readonly ILog _log =
            LogManager.GetLogger(typeof(LoggingVirtualPathVersioningProvider));

        public LoggingVirtualPathVersioningProvider(
            string name,
            NameValueCollection configParameters)
            : base(name, configParameters)
        { }

        protected override bool AcceptDirectoryRequest(UnifiedDirectory directory)
        {
            bool ret = base.AcceptDirectoryRequest(directory);

            _log.InfoFormat("AcceptDirectoryRequest(virtualPath='{0}') returns '{1}'",
                directory != null ? directory.VirtualPath : "null",
                ret);
            
            return ret;
        }

        public override string CombineVirtualPaths(
            string basePath,
            string relativePath)
        {
            return base.CombineVirtualPaths(basePath, relativePath);
        }

        protected override bool AcceptFileRequest(UnifiedFile file)
        {
            bool ret = base.AcceptFileRequest(file);

            _log.InfoFormat("AcceptFileRequest(virtualPath='{0}') returns '{1}'",
                file != null ? file.VirtualPath : "null",
                ret);
            
            return ret;
        }

        public override ObjRef CreateObjRef(Type requestedType)
        {
            return base.CreateObjRef(requestedType);
        }

        public override bool DirectoryExists(string virtualPath)
        {
            bool ret = base.DirectoryExists(virtualPath);

            _log.InfoFormat("DirectoryExists(virtualPath='{0}') returns '{1}'",
                virtualPath,
                ret);
            
            return ret;
        }

        public override bool FileExists(string virtualPath)
        {
            bool ret = base.FileExists(virtualPath);

            _log.InfoFormat("FileExists(virtualPath='{0}') returns '{1}'",
                virtualPath,
                ret);
            
            return ret;
        }

        public override CacheDependency GetCacheDependency(
            string virtualPath,
            IEnumerable virtualPathDependencies,
            DateTime utcStart)
        {
            return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }

        public override string GetCacheKey(string virtualPath)
        {
            string ret = base.GetCacheKey(virtualPath);
            
            _log.InfoFormat("GetCacheKey(virtualPath='{0}') returns '{1}'",
                virtualPath,
                ret);
            
            return ret;
        }

        public override VirtualDirectory GetDirectory(string virtualPath)
        {
            VirtualDirectory ret = base.GetDirectory(virtualPath);

            _log.InfoFormat("GetDirectory(virtualPath='{0}') returns '{1}'",
                virtualPath,
                ret != null ? ret.ToString() : "null");
            
            return ret;
        }

        public override string GetFileHash(
            string virtualPath,
            IEnumerable virtualPathDependencies)
        {
            return base.GetFileHash(virtualPath, virtualPathDependencies);
        }

        public override AccessLevel QueryAccess(
            string virtualPath,
            IPrincipal user)
        {
            AccessLevel ret = base.QueryAccess(virtualPath, user);
            
            _log.InfoFormat("QueryAccess(virtualPath='{0}', user='Name:{1} IsAuthenticated:{2}') returns {3}",
                virtualPath,
                user.Identity.Name,
                user.Identity.IsAuthenticated,
                ret);
            
            return ret;
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            _log.InfoFormat("Start GetFile(virtualPath='{0}')", virtualPath);
            
            if (PrincipalInfo.Current != null)
            {
                StringBuilder sb = new StringBuilder();
                try
                {
                    foreach (string role in PrincipalInfo.Current.RoleList)
                    {
                        sb.AppendFormat(" {0}", role);
                    }
                }
                catch { }

                _log.InfoFormat("GetFile(virtualPath='{0}') for user='{1}' in roles '{2}'",
                    virtualPath,
                    PrincipalInfo.Current.Name, sb.ToString());
            }
            else
            {
                _log.Info("No principal for user");
            }

            try
            {
                VirtualFile ret = base.GetFile(virtualPath);
                _log.InfoFormat("GetFile(virtualPath='{0}') returns '{1}'",
                    virtualPath,
                    ret != null ? ret.ToString() : "null");

                return ret;
            }
            catch (Exception ex)
            {
                _log.Error("Can't get File because", ex);
                throw ex;
            }
        }
    }
}
Version author:
Mattias Lövström

EPiServer version

'EPiServer CMS 5''EPiServer CMS 6'