まさにそれを行い、ElmahController をオーバーライドできます。実際、アレクサンダー・ベレツキーはすでに Elmah.Mvc という名前の nuget パッケージを提供しています。
独自の ElmahController を作成したら、任意の承認を適用できます。私のアプリケーションには、それを適用するベース承認済みコントローラーがあります。ルートを構成して Elmah の結果を返すだけでよく、彼のサイトにすべて詳しく説明されています。
更新:これを見てからしばらく経ちましたが、上記に触発されたが実際には使用していない独自のコントローラーがあります。
[Authorize]
public class ElmahController : BaseAuthorizedController
{
public ActionResult Index(string type)
{
return new ElmahResult(type);
}
}
結果はこれです
using System;
using System.Web;
using System.Web.Mvc;
namespace Epic.Mvc.Mvc.ActionResults
{
public class ElmahResult : ActionResult
{
private readonly string _resouceType;
public ElmahResult(string resouceType)
{
_resouceType = resouceType;
}
public override void ExecuteResult(ControllerContext context)
{
var factory = new Elmah.ErrorLogPageFactory();
if (!string.IsNullOrEmpty(_resouceType))
{
var pathInfo = "/" + _resouceType;
context.HttpContext.RewritePath(FilePath(context), pathInfo, context.HttpContext.Request.QueryString.ToString());
}
var currentApplication = (HttpApplication)context.HttpContext.GetService(typeof(HttpApplication));
if (currentApplication == null) return;
var currentContext = currentApplication.Context;
var httpHandler = factory.GetHandler(currentContext, null, null, null);
if (httpHandler is IHttpAsyncHandler)
{
var asyncHttpHandler = (IHttpAsyncHandler)httpHandler;
asyncHttpHandler.BeginProcessRequest(currentContext, r => { }, null);
}
else
{
httpHandler.ProcessRequest(currentContext);
}
}
private string FilePath(ControllerContext context)
{
return _resouceType != "stylesheet" ? context.HttpContext.Request.Path.Replace(String.Format("/{0}", _resouceType), string.Empty) : context.HttpContext.Request.Path;
}
}
}
そして、私には2つのルートがあります(2番目は非常にオプションです)
routes.MapRoute("ElmahHandler", "elmah/{type}", new { action = "Index", controller = "Elmah", type = UrlParameter.Optional });
routes.MapRoute("ElmahHandlerShortHand", "errors/{type}", new { action = "Index", controller = "Elmah", type = UrlParameter.Optional });