我遇到了以下代码,它们试图在自定义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();\
答案 0 :(得分:0)
请参阅我的回答here。
HttpContext.Current在HttpApplication.Start事件执行完毕之后才可用,如果在应用程序生命周期中过早地调用此代码,则可以解释您的NullReferenceException。
如果在此之后被调用,如果用户未登录,则incomingPrincipal.Identity
值也可能为空。
另一种可能性是IIS让你感到悲伤。您可以尝试设置context.Response.TrySkipIisCustomErrors = true;
以防止IIS干扰您的重定向。