地狱,
我的mvc应用程序的错误处理以下面的简化方式配置( globals.asax ):
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "General");
routeData.Values.Add("exc", exception);
Server.ClearError();
using (ErrorController errorController = new ErrorController())
{
((IController)errorController).Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
上面,我正在为控制器动态创建路由。它很有用,因为我可以将Exception对象传递给controller动作。这只是上面显示的简化版本,因为通常我会为各种异常类型创建不同的路由。我有 NO 静态路由,特别是在函数 RegisterRoutes 中进行错误处理。此功能未受影响:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = ""}
);
}
我的简化控制器看起来像这样:
public class ErrorController : Controller
{
public ActionResult General(Exception exc)
{
ViewData["ErrorDetails"] = exc.ToString();
return View("Error");
}
}
假设我有一个容易出错的网站:
HTTP:// 本地主机 /应用/网站/ WTF
当我在本地测试错误处理时,一切都很好。 ErrorController 正在调用常规操作,此操作会呈现错误视图。
但是当我从其他主机调用这个容易出错的站点时,例如,应用程序部署在nice.host.org服务器上:
的http:// nice.host.org /应用/网站/ WTF ,
我得到了这样的例外:
System.InvalidOperationException: The view 'Error' or its master was not found. The following locations were searched:
~/Views/DynamicPage/Error.aspx
~/Views/DynamicPage/Error.ascx
~/Views/Shared/Error.aspx
~/Views/Shared/Error.ascx
~/Views/DynamicPage/Error.cshtml
~/Views/Shared/Error.cshtml
at System.Web.Mvc.ViewResult.FindView(ControllerContext context)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
at System.Web.Mvc.Controller.ExecuteCore()
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
发生了什么事?如何按预期工作?
更新
我会提供一些额外的信息以防万一。
我正在使用剃刀视图引擎。在 Error.cshtml 视图文件的属性窗口中,我尝试将构建操作设置为无或内容,但应用程序的行为仍然被破坏,尽管选择了哪个选项。
当涉及到主web.config文件中的pages部分时,它看起来如下:
<pages>
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="MvcSiteMapProvider.Web.Html" />
</namespaces>
</pages>
并在第二个web.config中:
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
我会感激任何线索。
此致
答案 0 :(得分:1)
我发现了问题。我不得不将这样的条目添加到web.config
<customErrors mode="Off" />
customErrors配置中有三种错误模式:打开,关闭和 RemoteOnly 。 mode属性指定是启用,禁用自定义错误还是仅显示给远程客户端。
开启 - 指定启用自定义错误。如果未指定defaultRedirect属性,则用户会看到一般错误。自定义错误显示给远程客户端和本地主机。
关闭 - 指定禁用自定义错误。详细的ASP.NET错误将显示给远程客户端和本地主机。
RemoteOnly - 指定仅向远程客户端显示自定义错误,并向本地主机显示ASP.NET错误。
默认,模式值设置为 RemoteOnly 。
以前我在web.config中没有customErrors的配置条目,因此默认模式已打开。当视图本身出现错误时,会导致重定向到默认的customErrors url - Error.aspx,从而导致之前显示的异常:
System.InvalidOperationException: The view 'Error' or its master was not found. The following locations were searched:
~/Views/DynamicPage/Error.aspx
~/Views/DynamicPage/Error.ascx
~/Views/Shared/Error.aspx
~/Views/Shared/Error.ascx
~/Views/DynamicPage/Error.cshtml
~/Views/Shared/Error.cshtml
接下来由ErrorController处理此异常并向用户显示。
现在没关系。