代码之家  ›  专栏  ›  技术社区  ›  jwaliszko

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

  •  1
  • jwaliszko  · 技术社区  · 14 年前

    地狱,

    我有我的mvc应用程序错误处理配置在下面的简化方式( 全局.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));
             }         
          }
    

    上面,我正在为控制器动态创建路由。它很有用,因为我可以将异常对象传递给控制器操作。这只是上面显示的简化版本,因为通常我会为各种异常类型创建不同的路由。我有 为函数中的错误处理而定义的静态路由 . 此函数未被触及:

     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 .

    当我在本地测试错误处理时,一切正常。 误差控制器 总则 这个动作 错误 查看。

    但是当我从另一个主机调用这个容易出错的站点时,例如,应用程序部署在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)
    

    更新

    我会提供一些额外的信息以防万一。

    我在用 razor视图引擎 . 在的“属性”窗口中 错误.cshtml 查看文件,我已尝试设置 构建操作 没有 内容

    当涉及到主页面部分时web.config文件文件,如下所示:

    <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 回复  |  直到 14 年前
        1
  •  1
  •   jwaliszko    14 年前

    我发现了问题。我不得不把这样的条目添加到web.config文件

    <customErrors mode="Off" /> 
    

    仅远程 . mode属性指定是启用、禁用自定义错误,还是仅向远程客户端显示自定义错误。

    -指定启用自定义错误。如果未指定defaultRedirect属性,则用户将看到一个常规错误。自定义错误将显示给远程客户端和本地主机。

    -指定禁用自定义错误。详细的ASP.NET错误将显示给远程客户端和本地主机。

    仅远程 -指定自定义错误仅显示给远程客户端,并且ASP.NET错误将显示给本地主机。

    违约 ,模式值设置为 .

    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处理并显示给用户。

    现在没事了。