从远程主机调用站点时的动态路由问题

时间:2010-10-04 13:37:48

标签: c# .net asp.net-mvc

地狱,

我的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>

我会感激任何线索。

此致

1 个答案:

答案 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处理此异常并向用户显示。

现在没关系。