Ethan Schofer
Ethan Schofer

Reputation: 1848

Sitecore and MVC Filters

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

Answers (3)

Devin Gleason Lambert
Devin Gleason Lambert

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

enter image description here

Upvotes: 0

Ethan Schofer
Ethan Schofer

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

Vlad Iobagiu
Vlad Iobagiu

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

Related Questions