2010-10-04 16 views
1

地獄,動態路由問題從遠程主機調用的網站時

我有錯誤處理,我在下面的簡化的方式配置的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對象傳遞給控制器​​操作。這只是上面顯示的簡化版本,因爲通常我爲各種異常類型創建不同的路由。我有編號爲的靜態路由,專門用於功能中的錯誤處理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:// 本地主機 /應用/ site/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) 

這是怎麼回事?如何按預期做到這一點?

UPDATE

我會提供一些額外的信息,以防萬一。我使用剃刀視圖引擎。在Error.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> 

我會感激任何線索。

Regards

+0

您是否在本地和託管示例上使用相同的服務器(例如IIS)託管該站點?如果你不這樣做,可以解釋爲什麼你在一個錯誤而不是另一個錯誤。 – 2010-10-04 15:16:40

+0

是的,服務器是相同的,服務器設置是相同的。 – jwaliszko 2010-10-04 15:22:54

回答

1

我發現問題了。我有這樣的條目添加到web.config中

<customErrors mode="Off" /> 

有中的customErrors配置的三個錯誤模式:僅限遠程。 mode屬性指定自定義錯誤是啓用,禁用還是僅向遠程客戶端顯示。

On - 指定啓用自定義錯誤。如果未指定defaultRedirect屬性,則用戶會看到一個通用錯誤。自定義錯誤會顯示給遠程客戶端和本地主機。

關閉 - 指定禁用自定義錯誤。詳細的ASP.NET錯誤會顯示給遠程客戶端和本地主機。

RemoteOnly - 指定自定義錯誤僅顯示給遠程客戶端,並且ASP.NET錯誤顯示給本地主機。

通過默認,模式值設定爲僅限遠程

以前我沒有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並處理下一個向用戶顯示。

現在沒關係。