Controller.Execute的替代品

时间:2014-11-25 08:43:36

标签: asp.net-mvc asp.net-mvc-4

我遇到了以下代码,它们试图在自定义STS网站中处理身份验证异常。这看起来很顺利,但在致电Controller.Execute时,我得到了NullReferenceException。我想避免烦人的黑盒子调用这个方法,而是直接重定向到操作,或抛出自定义异常并设置内置错误处理,以便在抛出自定义异常时进行重定向。我实际上需要一些关于如何正确做的建议。

var logId = LogProvider.Current.LogError(LogLevel.Fatal,e.InnerException ?? e, "Unexpected error during user authentication: [{0}]", incomingPrincipal.Identity.Name);
var context = HttpContext.Current; 
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "Index");
routeData.Values.Add("errorId", logId);
routeData.Values.Add("exceptionMessage", "");
IController controller = new ErrorController();
var ctx = new RequestContext(new HttpContextWrapper(context), routeData);
controller.Execute(ctx);
context.Response.End();\

1 个答案:

答案 0 :(得分:0)

请参阅我的回答here

HttpContext.Current在HttpApplication.Start事件执行完毕之后才可用,如果在应用程序生命周期中过早地调用此代码,则可以解释您的NullReferenceException。

如果在此之后被调用,如果用户未登录,则incomingPrincipal.Identity值也可能为空。

另一种可能性是IIS让你感到悲伤。您可以尝试设置context.Response.TrySkipIisCustomErrors = true;以防止IIS干扰您的重定向。