Reputation: 1848
I want to implement additional global filters in a Sitecore 8 MVC application. It seems like I need to override the default Sitecore InitializeGlobalFilters pipeline. But the lack of documentation makes me nervous. Am I going to break something by overriding this?
Upvotes: 4
Views: 1657
Reputation: 1730
For the record, I went back to the Sitecore.Mvc.dll
and decompiled it so I could see what the previously registered Sitecore.Mvc.Pipelines.Loader.InitialzeGlobalFilters.cs
class was doing. Here it is. I am going to go ahead in my implementation, and configure both of them, rather safe than sorry. I also decompiled the PipelineBasedRequestFilter.cs
which also looked like logic i'd rather leave in place.
// Decompiled with JetBrains decompiler
// Type: Sitecore.Mvc.Pipelines.Loader.InitializeGlobalFilters
// Assembly: Sitecore.Mvc, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 4DE79547-0FD4-45A0-BD18-FFEF21AA18FC
// Assembly location: C:\P2\packages\Sitecore.Mvc.NoReferences.8.2.180406\lib\NET452\Sitecore.Mvc.dll
using Sitecore.Mvc.Filters;
using Sitecore.Pipelines;
using System.Web.Mvc;
namespace Sitecore.Mvc.Pipelines.Loader
{
[UsedImplicitly]
public class InitializeGlobalFilters
{
public virtual void Process(PipelineArgs args)
{
this.AddGlobalFilters(args);
}
protected virtual void AddGlobalFilters(PipelineArgs args)
{
GlobalFilters.Filters.Add(this.CreateRequestFilter());
}
protected virtual object CreateRequestFilter()
{
return (object) new PipelineBasedRequestFilter();
}
}
}
PipelineBasedRequestFilter.cs
// Decompiled with JetBrains decompiler
// Type: Sitecore.Mvc.Filters.PipelineBasedRequestFilter
// Assembly: Sitecore.Mvc, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 4DE79547-0FD4-45A0-BD18-FFEF21AA18FC
// Assembly location: C:\P2\packages\Sitecore.Mvc.NoReferences.8.2.180406\lib\NET452\Sitecore.Mvc.dll
using Sitecore.Diagnostics;
using Sitecore.Mvc.Diagnostics;
using Sitecore.Mvc.Pipelines;
using Sitecore.Mvc.Pipelines.MvcEvents.ActionExecuted;
using Sitecore.Mvc.Pipelines.MvcEvents.ActionExecuting;
using Sitecore.Mvc.Pipelines.MvcEvents.Exception;
using Sitecore.Mvc.Pipelines.MvcEvents.ResultExecuted;
using Sitecore.Mvc.Pipelines.MvcEvents.ResultExecuting;
using System.Web.Mvc;
namespace Sitecore.Mvc.Filters
{
public class PipelineBasedRequestFilter : IActionFilter, IResultFilter, IExceptionFilter
{
public virtual void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
Assert.ArgumentNotNull((object) actionExecutedContext, nameof (actionExecutedContext));
using (TraceBlock.Start("Action Executed"))
PipelineService.Get().RunPipeline<ActionExecutedArgs>("mvc.actionExecuted", new ActionExecutedArgs(actionExecutedContext));
}
public virtual void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
Assert.ArgumentNotNull((object) actionExecutingContext, nameof (actionExecutingContext));
using (TraceBlock.Start("Action Executing"))
PipelineService.Get().RunPipeline<ActionExecutingArgs>("mvc.actionExecuting", new ActionExecutingArgs(actionExecutingContext));
}
public virtual void OnException(ExceptionContext exceptionContext)
{
Assert.ArgumentNotNull((object) exceptionContext, nameof (exceptionContext));
using (TraceBlock.Start("Exception event"))
PipelineService.Get().RunPipeline<ExceptionArgs>("mvc.exception", new ExceptionArgs(exceptionContext));
}
public virtual void OnResultExecuted(ResultExecutedContext resultExecutedContext)
{
Assert.ArgumentNotNull((object) resultExecutedContext, nameof (resultExecutedContext));
using (TraceBlock.Start("Result Executed event"))
PipelineService.Get().RunPipeline<ResultExecutedArgs>("mvc.resultExecuted", new ResultExecutedArgs(resultExecutedContext));
}
public virtual void OnResultExecuting(ResultExecutingContext resultExecutingContext)
{
Assert.ArgumentNotNull((object) resultExecutingContext, nameof (resultExecutingContext));
using (TraceBlock.Start("Result Executing event"))
PipelineService.Get().RunPipeline<ResultExecutingArgs>("mvc.resultExecuting", new ResultExecutingArgs(resultExecutingContext));
}
}
}
Edit:
Oh and one more thing, coincidentally I figured out what the PipelineBasedRequestFilter.cs
is used for! Turns out it looks like it's being used for some of the profiling in the Sitecore Debugger!
http://www.glass.lu/Blog/Archive/Using%20the%20Sitecore%20Debug%20Tool%20Part%201
Upvotes: 0
Reputation: 1848
Solved by overriding Sitecore's pipeline.
First, created new pipeline:
[UsedImplicitly]
public class InitializeGlobalFilters
{
public virtual void Process(PipelineArgs args)
{
this.AddGlobalFilters(args);
}
protected virtual void AddGlobalFilters(PipelineArgs args)
{
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalFilters.Filters.Add(this.CreateRequestFilter());
}
protected virtual object CreateRequestFilter()
{
return (object)new PipelineBasedRequestFilter();
}
}
Then add patch config that inserted this in the correct location in the pipeline (mimicing where Sitecore had it:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<initialize>
<processor type="Sitecore.Mvc.Pipelines.Loader.InitializeGlobalFilters, Sitecore.Mvc">
<patch:attribute name="type">DD.Platform.Sc.Pipelines.MvcPipelines.InitializeGlobalFilters, DD.Platform.Sc</patch:attribute>
</processor>
</initialize>
</pipelines>
</sitecore>
</configuration>
Upvotes: 2
Reputation: 4118
We used in a one project filters.
In the global.asax we have:
protected void Application_Start()
{
...
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
...
}
In the App_Start folder we have FilterConfig class
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
We have also a filter class
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
....
base.OnActionExecuting(filterContext);
}
}
and everything works fine, we didn't ovveride InitializeGlobalFilters pipeline.
Upvotes: 0