We've implemented error handling for missing images in Sitecore like so:
https://nourestani.wordpress.com/2015/05/11/error-executing-child-request-sitecore-for-404-useserversideredirect-transferrequest-vs-transfer/ which came from this post by Michael West: How do you setup a 404 and 500 error page for missing files and media items?.
This all works fine on CD servers, but we've seen an issue where on CA we get an error:
Could not find method: Process. Pipeline: /sitecore[database="SqlServer" xmlns:patch="http://www.sitecore.net/xmlconfig/"]/pipelines/httpRequestBegin/processor[type="Custom.Sitecore.Extensions.Pipelines.CustomMediaRequestHandler, Custom.Sitecore.Extensions" patch:source="Custom.Pipelines.config"
I've triple checked there are no issues with typos or anything as described here:
I've solved this by only deploying this patch in our CD config and not our CA config as it isn't a much of an issue on CA. However I'd like to resolve this for CA also and understand if we've missed anything or there is a better approach for this.
Further info:
Our Patch:
<pipelines>
<httpRequestBegin>
<!--fix issue with missing media files throwing errors in logs-->
<processor type="Custom.Sitecore.Extensions.Pipelines.CustomMediaRequestHandler, Custom.Sitecore.Extensions" />
</httpRequestBegin>
</pipelines>
The Pipline:
public class CustomMediaRequestHandler : MediaRequestHandler
{
protected override bool DoProcessRequest(HttpContext context)
{
Assert.ArgumentNotNull(context, "context");
MediaRequest request = MediaManager.ParseMediaRequest(context.Request);
if (request == null)
return false;
Media media = MediaManager.GetMedia(request.MediaUri);
if (media != null)
return DoProcessRequest(context, request, media);
using (new SecurityDisabler())
media = MediaManager.GetMedia(request.MediaUri);
string str;
if (media == null)
{
str = Settings.ItemNotFoundUrl;
}
else
{
Assert.IsNotNull(Context.Site, "site");
str = Context.Site.LoginPage != string.Empty ? Context.Site.LoginPage : Settings.NoAccessUrl;
}
if (Settings.RequestErrors.UseServerSideRedirect)
HttpContext.Current.Server.TransferRequest(str);
else
HttpContext.Current.Response.Redirect(str);
return true;
}
}