我有錯誤處理,我在下面的簡化的方式配置的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
您是否在本地和託管示例上使用相同的服務器(例如IIS)託管該站點?如果你不這樣做,可以解釋爲什麼你在一個錯誤而不是另一個錯誤。 – 2010-10-04 15:16:40
是的,服務器是相同的,服務器設置是相同的。 – jwaliszko 2010-10-04 15:22:54