我是第一次同时处理ASP.NET,MVC 3,Web开发.请耐心等待,因为我知道这个问题已经从不同角度进行了大量讨论.我仍然没有找到我的具体问题的答案:为什么我的应用程序在404发生时找不到我的Error.cshtml文件,当它发现它与其他错误一样好的时候?
(环境:Win 7 64位,IIS7,SQL 2008 Express,VS2010,ASP.NET 4,MVC3,EF v4)
我有一个控制器WorkerController.cs,它正确地从数据库读取和写入.如果我更改数据库名称而不更新我的DbContext,它会给我一个错误.当我将web.config更改为始终显示自定义错误时,显示/Views/Shared/Error.cshtml文件.
我没有 FooController.cs文件.如果我去/ Foo,我会得到404错误,正如预期的那样.它告诉我它找不到资源/ Foo.
当我设置customErrors mode ="On"并向/ Foo发出http请求时,我收到404错误,指出无法找到/Error.cshtml.
我正在搜索和阅读讨论使用指定控制器处理错误的各种方法的帖子,但我真的想知道我错过了什么.为什么它会找到其他错误的/Error.cshtml,而不是404错误?
在我在IIS 7中运行的ASP.NET 4.0 MVC项目中,我已经设置并配置了ELMAH以记录我的站点上的错误.但是,我无法获得有关代码500的错误的任何报告.
我设置了一个简单的控制器,它创建了一个被零除的异常,但是ELMAH没有记录它.我可以让ELMAH记录其他消息就好了,我没有过滤掉ErrorLog_Filtering中的任何异常.
另外,为了显示自定义页面,我更新了web.config的httpErrors部分,如下所示:
<customErrors mode="RemoteOnly" defaultRedirect="~/error/GenericError">
<error statusCode="403" redirect="~/error/AccessDenied" />
<error statusCode="404" redirect="~/error/NotFound" />
<error statusCode="500" redirect="~/error/Offline" />
<error statusCode="501" redirect="~/error/Offline" />
<error statusCode="503" redirect="~/error/Offline" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)
和
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" >
<error statusCode="403" prefixLanguageFilePath="" path="/error/AccessDenied" responseMode="ExecuteURL" />
<error statusCode="404" prefixLanguageFilePath="" path="/error/NotFound" responseMode="ExecuteURL" />
<error statusCode="500" prefixLanguageFilePath="" path="/error/GenericError" responseMode="ExecuteURL" />
<error statusCode="501" prefixLanguageFilePath="" path="/error/GenericError" responseMode="ExecuteURL" />
<error statusCode="503" prefixLanguageFilePath="" path="/error/Offline" responseMode="ExecuteURL" />
Run Code Online (Sandbox Code Playgroud)
最后,在查看应用程序日志文件时,代码500错误消息不会显示在那里.
是否存在我缺少的配置或者我是否在某种程度上意外地自行捕获错误并且不让它传播?
我在VS10中启动了一个MVC 3模板项目,并修改了global.asax.cs:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute { ExceptionType = typeof(DivideByZeroException), View = "DivideByZeroException", Order = 1 });
filters.Add(new HandleErrorAttribute { View = "AllOtherExceptions", Order = 2 });
}
Run Code Online (Sandbox Code Playgroud)
到web.config我添加了:
<customErrors mode="On">
Run Code Online (Sandbox Code Playgroud)
然后创建了相应的视图,最后在其中一个动作中添加了DivideByZero-throw.
结果:呈现了视图AllOtherExceptions.
在我的web.config中的customErrors标记中,我指向一个控制器.在我的控制器中,我将重定向到由多个应用程序共享的外部错误页面.
<customErrors defaultRedirect="~/Error/ServerError" mode="On">
我的控制器:
public class ErrorController : Controller
{
public ActionResult ServerError()
{
return Redirect("/Systems/ASPNETErrorHandling/ErrorPage.aspx");
}
public ActionResult ErrorTest()
{
throw new Exception("testing error handling");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在调用Error/ErrorTest来测试错误处理.但它总是重定向到Views/Shared/Error.cshtml而不是重定向到我指定的控制器.
如何让asp.net mvc遵守customErrors设置中的defaultRedirect路径?
UDPATE:我还使用ELMAH并重写HandleErrorAttribute在描述这个职位.我从.Net Reflector看到,基础HandleErrorAttribute将Error设置为视图.我不认为我可以做很多事情,重定向到Error.cshtml,或其他一些视图.
error-handling asp.net-mvc custom-error-pages custom-errors asp.net-mvc-3
我创建了一个这样的自定义属性类
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class AMemento : Attribute
{
public void method(){
try {
}
catch (Exception) {
}}
}
Run Code Online (Sandbox Code Playgroud)
并且我计划在处理程序中使用此自定义属性来捕获发生的任何异常,如下所示
[AMemento]
[Authorize]
public JsonResult GetWeatherData()
{
//// code here which throw an exception
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何完成自定义属性类以捕获 GetWeatherData() 处理程序中抛出的异常。是否可以像在 python 中那样实现高阶函数?
我一直在我的开发机器上使用ELMAH,它工作正常.我也在Win2008 IIS7上部署它,并在强制例外情况下运行LOCALHOST网站并记录..但是,当我尝试在其他机器上浏览网站时(使用网络上的其他机器浏览网站)ELMAH没有记录..我检查App_Data是否为xml而没有创建.我已经在文件夹上提供了网络服务持久性.
因此,问题是在localhost ELMAH日志中浏览网站时,在其他机器上浏览它时没有记录.
下面是我的web.config文件..
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
</sectionGroup>
</sectionGroup>
</sectionGroup>
<sectionGroup name="elmah">
<section name="security" …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ELMAH进行错误记录,我尝试了其他几个
当启用ASP.NET中的自定义错误功能时,这两种情况似乎都没有记录错误
我在所有控制器中使用[HandleError]属性,起初我认为这是问题,但不只是每当我启用自定义错误页面时它都不记录任何错误,即使这些错误记录库中有一半说他们是假设的.
我究竟做错了什么?
我正在阅读以下文章:http: //odetocode.com/articles/294.aspx
这篇文章提出了很多关于日志的问题.(我不知道我是否应该在分开的问题中做出这个...但我不想垃圾堆栈stackoverflow.com与我的问题)
第一个是我应该将它存储在.txt或.xml文件中......甚至存储在数据库中的表中.可能在.txt中保存性能会更好.但是当有人需要找到.txt文件的内容时,它可能会成为......颈部的痛苦.那么......我应该使用哪一个,为什么?
第二个,是否有任何特定的类来处理"日志"的事情?我已经阅读了关于这个主题的几个主题,但我没有找到我的问题的答案.
提前致谢.
我有一个MVC 2应用程序,应该总是提供一个"漂亮的"404页面.
但是目前我得到了一个低级别的.Net:"'/ sitename'应用程序中的服务器错误..."
我有一个基本控制器,它有一个NotFound动作,将呈现漂亮的404页面.
处理缺失的操作:
protected override void HandleUnknownAction(string actionName)
{
this.NotFound(actionName).ExecuteResult(this.ControllerContext);
}
Run Code Online (Sandbox Code Playgroud)
所以访问{site}/ValidController/NotAnAction正确地路由.
但是访问{site}/NotAController没有.
我设置的路线全部为:
routes.MapRoute(
"MVC routes",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional });
routes.MapRoute(
"Catch All",
"{*url}",
new { controller = "System", action = "NotFound" });
Run Code Online (Sandbox Code Playgroud)
catch全部正确捕获不匹配的路由.
所以{site}/Invalid/Action/id/extra通过catch all正确路由.
然而{site}/Invalid,通过"MVC路由"路由获取并且ASP.Net寻找InvalidController,并且当它找不到时抛出一个愚蠢的异常.
我知道我可以在web.config关卡中覆盖它,但这只是重定向到页面.我想知道路由模式何时匹配但控制器不是有效的控制器名称.
我在哪里可以捕捉并改变这种行为?
我目前正在使用mvc4和vs2012,我已经安装了mvc.elmah nugget.
我做了什么 ?
最初我没有写任何代码,我的异常记录在ELMAH中.
后来我决定使用MVC HandleError来处理Application Exceptions并添加过滤器
filters.Add(new HandleErrorAttribute());
Run Code Online (Sandbox Code Playgroud)
现在我在过滤器中调试,看到我有2个过滤器 ELMAH HandleErrorAttribute and MVC HandleErrorAttribute !
我看到了这个优秀的链接/sf/answers/415580721/,其中讨论了如何使用ErrorSignal来处理应用程序异常
但是我没有使用,ErrorSignal但我的例外情况仍被ELMAH捕获?
如果我使用
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
Run Code Online (Sandbox Code Playgroud)
我的例外记录两次.
我的问题如下
目前正在做什么
添加过滤器
filters.Add(new HandleErrorAttribute());
Run Code Online (Sandbox Code Playgroud)
和覆盖(将来处理Ajax错误)
public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
}
Run Code Online (Sandbox Code Playgroud)
这是足够的还是什么是好的做法?我没有提高ErrorSignal,因为它记录了两次.
我没有使用任何try.catch正在使用下面的行,并希望我的例外处理.
base.OnException(context);
Run Code Online (Sandbox Code Playgroud)
}
只是想确保我正确的方式!
谢谢你的时间
我正在尝试将一堆ASP.Net MVC网站迁移到Azure.在这个过程中,我注意到Elmah不能在任何这些网站上运行.我创建了最简单的案例来测试,发现它也不起作用.
在Azure上我创建了一个"标准层"网站,我没有进一步配置它.
在Visual Studio中,我创建了一个新的ASP.NET MVC网站.我添加了Nuget"Elmah"包.我在web.config中将一行更改为:
<security allowRemoteAccess="true" />
Run Code Online (Sandbox Code Playgroud)
这个更改是为了让我查看elmah页面.(我知道不安全,但只是想证明一点)
我还更改了控制器,以便单击about菜单会生成异常.否则这是一个通用的MVC网站.本地一切都很好,我可以生成异常并看到它显示在Elmah.axd页面上,但是一旦我将网站部署到Azure,Elmah页面上就不会显示任何数据.
我已将样本保留在线以用于演示目的:
接下来访问:http://testelmah.azurewebsites.net并点击.您应该看到一条错误消息,指出发生了异常.
对Elmah不工作感到困惑
我花了几个小时搜索解决方案,似乎Elmah只适用于Azure中的其他所有人.我错过了什么?