404如果将无效参数传递给我的控制器,我想返回HTTP状态.例如,如果我有一个看起来像这样的控制器:
public ActionResult GetAccount(int id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后我想返回404如果遇到这样的网址:
/GetAccount /GetAccount/notanumber
即我想陷阱ArgumentException被抛出.
我知道我可以使用可以为空的类型:
public ActionResult GetAccount(int? id)
{
if(id == null) throw new HttpException(404, "Not found");
}
Run Code Online (Sandbox Code Playgroud)
但那非常狡猾和重复.
我希望我可以在必要时将它添加到我的控制器:
[HandleError(View="Error404", ExceptionType = typeof(ArgumentException))]
public class AccountsController : Controller
{
public ActionResult GetAccount(int id)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎并不奏效.
在该答案中,创建了一个抽象的BaseController,您可以从中派生所有其他控制器:
public abstract class MyController : Controller
{
#region Http404 handling
protected override void HandleUnknownAction(string actionName)
{
// If controller …Run Code Online (Sandbox Code Playgroud) asp.net error-handling asp.net-mvc asp.net-mvc-routing asp.net-mvc-3
我在我的共享主机上部署的ASP.NET MVC应用程序上遇到自定义错误问题.我创建了一个ErrorController并将以下代码添加到Global.asax以捕获未处理的异常,记录它们,然后将控制转移到ErrorController以显示自定义错误.此代码取自此处:
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Response.Clear();
HttpException httpEx = ex as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpEx == null)
{
routeData.Values.Add("action", "Index");
}
else
{
switch (httpEx.GetHttpCode())
{
case 404:
routeData.Values.Add("action", "HttpError404");
break;
case 500:
routeData.Values.Add("action", "HttpError500");
break;
case 503:
routeData.Values.Add("action", "HttpError503");
break;
default:
routeData.Values.Add("action", "Index");
break;
}
}
ExceptionLogger.LogException(ex); // <- This is working. Errors get logged
routeData.Values.Add("error", ex);
Server.ClearError();
IController controller = new ErrorController(); …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种标准方法来处理asp.net mvc 2.0或3.0中的错误
我有一个MVC 4应用程序,使用自定义HandleErrorAttribute来处理自定义异常.我想截取默认的404和其他非500错误页面,并用更有吸引力的东西替换它们.为此,我在Web.config中添加了以下内容:
<system.web>
<customErrors mode="On" defaultRedirect="~/Error/Index" />
...
</ system.web>
Run Code Online (Sandbox Code Playgroud)
我有一个带有索引方法和相应视图的错误控制器,但我仍然得到默认的404错误页面.我也试过设置我defaultRedirect的静态html文件无济于事.我已经尝试添加特定于404内部的错误处理<customErrors>,我甚至尝试以编程方式修改路由,所有这些都没有结果.我错过了什么?为什么ASP忽略我的默认错误处理?
注意:我之前注意到我无法在本地测试我的CustomHandleErrorAttribute,即使是<customErrors mode="On".当我在我的服务器上从我的开发盒中点击它时它确实有效...不确定这是否相关. 这家伙有同样的问题.
我在这里发现了另一个问题,它提供了我的问题的第一部分的解决方案,即如何在ASP.NET MVC中生成404页面而不重定向到另一个页面(因此最初请求的URL保留在地址栏中).
ASP.NET MVC - 如何抛出类似于StackOverflow上的404页面
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
Response.Clear();
var httpException = exception as HttpException;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException != null)
{
routeData.Values.Add("action", httpException.GetHttpCode() == 404 ? "NotFound" : "Unknown");
// clear the error, otherwise, we will always get the default error page.
Server.ClearError();
// call the controller with the route
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用IOCControllerFactory,404方面的工作对我来说很好,但是一旦我使用工厂,不 …
在我的asp.net网站上,我在web.config文件中定义了以下自定义错误页面.
<customErrors mode="On" defaultRedirect="~/defaulterror.htm" >
<error statusCode="404" redirect="~/404.htm" />
Run Code Online (Sandbox Code Playgroud)
当找不到文件时它正确显示404.htm页面,但问题是当我做Fiddler跟踪它返回302作为HTTP状态代码.这是搜索引擎页面索引的一个大问题,因为这些破坏的链接仍然被索引最近因为这个在我的网站上.如何防止返回302作为文件未找到错误的HTTP状态代码,并返回404文件未找到错误.我正在使用asp.net 3.5.
我试图在一个库存样本ASP.NET MVC3网站上有2个自定义错误页面.
Darin Dimitrov在这里有一个很好的答案,但它并不适合我所有的测试条件.
然后广泛流行如何在ASP.NET MVC中正确处理404?发布..但这只是触及404错误.
有人可以解释一下
web.config 设置要做这个非常简单的事情:(
接受这个答案的场景:
ErrorController)......并为测试路线......
/Home/Index - >显示索引页面/Home - >显示索引页面/ - >显示索引页面/Home/About - >显示关于页面/asdasd/asdsad/asdas/asddasd/adsad - > 404/adsa/asda/asd/asd/asd/asd - > 404/asdsadasda - > 404然后将其添加到HomeController.cs班级..
public ActionResult ThrowException()
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
现在 ..
/home/throwexception - > 500错误干杯:)
顺便说一下,当使用股票标准new ASP.NET MVC3 …
美好的一天!
我使用策略来处理404错误,如下所示:ASP.NET MVC 2和IIS 7.0的错误处理或者:如何在ASP.NET MVC中正确处理404?
简而言之:我在Global.asax没有添加任何路由规则的情况下处理404作为异常,如果异常是404我将使用错误消息呈现特殊控制器\动作.
在IIS6上,它适用于ASP.NET通配符映射.在集成模式的IIS7上,我需要添加以下内容Web.config(/error/HttpError404我在404页面的操作):
<httpErrors>
<remove statusCode="403" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/error/HttpError404" responseMode="ExecuteURL" />
<error statusCode="403" prefixLanguageFilePath="" path="/error/HttpError403" responseMode="ExecuteURL" />
</httpErrors>
Run Code Online (Sandbox Code Playgroud)
为什么?路由在IIS集成模式和IIS6通配符映射上的工作方式不同?
提前致谢!
更新: 根据我的测试,似乎我的错误处理工作,我的404操作呈现,但似乎IIS看到404响应代码(我在404操作中以编程方式设置)并用默认错误替换我的页面.
当我设置时,<httpErrors>我有两个点击404页面:一个来自异常处理Global.asax,一个来自IIS.
这可能是原因吗?
使用Cassini但切换到IIS Express.我最初的想法是,<system.web>除了以下内容之外我可以删除所有内容:
<authentication mode="Forms">
<forms loginUrl="/" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
我以前customErrors的设置是这样的:
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)
我customErrors切换到IISExpress时删除了这个元素.现在404不再重定向到我漂亮的"NotFound"页面了.
用于我的网站的AppPool Clr4IntegratedAppPool让我知道它不使用Classic.
为什么IISExpress如此依赖于system.webIIS 7.5使用system.webServer?
我们可能知道,例如customErrors和httpErrors有什么区别?,CustomErrors是一种在Web应用程序中定义错误页面的旧方法,但这种方法存在一些问题 - 例如,如果您关心正确的http响应代码,因为CustomErrors的方法是重定向到错误页面而不是替换当前响应,它通过http状态代码破坏了通信的大部分语义完整性.
自IIS 7.0以来,HttpErrors是一个更新的功能,它在服务器级而不是应用程序级运行,并且更适合以有效的方式处理错误响应,例如通过使用当前响应而不是重定向.
但是,如果在我看来,ASP.NET中这些工件的基础结构如今看起来给我们带来了一些问题.
一个简单的配置作为例子
<httpErrors existingResponse="Auto" errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/Error/E404" responseMode="ExecuteURL" />
</httpErrors>
Run Code Online (Sandbox Code Playgroud)
我们将errorMode设置为Custom,因为我们要测试错误处理本身,并将existingResponse设置为Auto,这将引入依赖于Response.TrySkipIisCustomErrors的分支:
理想情况下,这将允许我们自己处理一些错误,例如当../product/id中的产品不存在时,我们可以手动返回特定的404页面,其中包含有关缺失产品的信息,并且仍然让HttpErrors模块处理所有错误像..产品 /名称,但是只是../misspelledandunmatchableurl.
但是,据我所知,这是行不通的.原因在于内部方法System.Web.HttpResponse .ReportRuntimeError,它将在运行时错误(例如未找到控制器/操作)上调用,并且我们有一个如下所示的部分:
// always try to disable IIS custom errors when we send an error
if (_wr != null) {
_wr.TrySkipIisCustomErrors = true;
}
if (!localExecute) {
code = HttpException.GetHttpCodeForException(e);
// …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×8
asp.net ×4
.net ×2
c# ×1
global-asax ×1
iis ×1
iis-6 ×1
iis-7 ×1
iis-7.5 ×1
iis-express ×1