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;
}
}
}
}