Asp.net mvc ASP.NET MVC 5-(HTTP错误404.0-未找到)具有长的不存在URL
我在Microsoft Visual Studio Express 2013中为Web创建了一个新项目。 这是一个ASP.NETMVC5-.NETFramework4.5项目 我想处理(找不到资源): 我确实用下面的代码处理了它 如果我执行类似(/Home/kddiede/ddij)或(/djdied/djie/djs)的操作,则此代码将正常工作,这将导致显示我的自定义错误页面 但是,当我尝试执行类似(/Home/kddiede/ddij/dfd/sdfds/dsf/dsfds/fd)或任何不存在的长URL时,它会显示以下内容: 代码来源: 提示16:自定义错误屏幕 错误页面位于/View/Shared/Error.cshtml中 Web.configAsp.net mvc ASP.NET MVC 5-(HTTP错误404.0-未找到)具有长的不存在URL,asp.net-mvc,url,http-status-code-404,asp.net-routing,Asp.net Mvc,Url,Http Status Code 404,Asp.net Routing,我在Microsoft Visual Studio Express 2013中为Web创建了一个新项目。 这是一个ASP.NETMVC5-.NETFramework4.5项目 我想处理(找不到资源): 我确实用下面的代码处理了它 如果我执行类似(/Home/kddiede/ddij)或(/djdied/djie/djs)的操作,则此代码将正常工作,这将导致显示我的自定义错误页面 但是,当我尝试执行类似(/Home/kddiede/ddij/dfd/sdfds/dsf/dsfds/fd)或任何不
<system.web>
<customErrors mode="RemoteOnly" />
</system.web>
ErrorConfig类
public class ErrorConfig
{
public static void Handle(HttpContext context)
{
switch (context.Response.StatusCode)
{
//Not authorized
case 401:
Show(context, 401);
break;
//Not found
case 404:
Show(context, 404);
break;
}
}
static void Show(HttpContext context, Int32 code)
{
context.Response.Clear();
var w = new HttpContextWrapper(context);
var c = new ErrorController() as IController;
var rd = new RouteData();
rd.Values["controller"] = "Error";
rd.Values["action"] = "Index";
rd.Values["id"] = code.ToString();
c.Execute(new RequestContext(w, rd));
}
}
误差控制器
internal class ErrorController : Controller
{
[HttpGet]
public ViewResult Index(Int32? id)
{
var statusCode = id.HasValue ? id.Value : 500;
var error = new HandleErrorInfo(new Exception("An exception with error " + statusCode + " occurred!"), "Error", "Index");
return View("Error", error);
}
}
我上面提到的网站的最后一段代码没有添加到Global.asax中,因为它已经在FilterConfig.cs中了
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
有人知道怎么修吗
提前感谢。已解决。要将所有不存在的URL指向错误页面,请执行以下操作:
- 在RouteConfig.cs文件末尾添加以下代码:
public static void RegisterRoutes(RouteCollection routes) { // Default routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); // Add this code to handle non-existing urls routes.MapRoute( name: "404-PageNotFound", // This will handle any non-existing urls url: "{*url}", // "Shared" is the name of your error controller, and "Error" is the action/page // that handles all your custom errors defaults: new { controller = "Shared", action = "Error" } ); }
- 将以下代码添加到Web.config文件:
<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"></modules> </system.webServer> <system.web> <httpRuntime relaxedUrlToFileSystemMapping="true" /> </system.web> </configuration>
这会将所有不存在的URL(如(/ad/asd/sa/das,d/asd,asd.asd+dpwd'=12=2e-21)指向错误页。另一种方法是将其添加到
system.web
元素内部的web.config中
<system.web>
<!-- ... -->
<!--Handle application exceptions-->
<customErrors mode="On">
<!--Avoid YSOD on 404/403 errors like this because [HandleErrors] does not catch them-->
<error statusCode="404" redirect="Error/Index" />
<error statusCode="403" redirect="Error/Index" />
</customErrors>
</system.web>
我在使用此解决方案时遇到问题,这是因为我的操作上有[Route()]属性,所以MVC对其进行了不同的映射。我在互联网上进行了一项研究。人们不建议使用runAllManagedModulesForAllRequest=“true”
。是否有任何方法可以只使用所需的模块?从用户的角度来看,这是可行的,但实际上不会为未找到的页面创建路由,这些页面可能与站点框架的其余部分一起工作,也可能不工作。在访问无效URL时,它仍然会导致引发应用程序错误。
<system.web>
<!-- ... -->
<!--Handle application exceptions-->
<customErrors mode="On">
<!--Avoid YSOD on 404/403 errors like this because [HandleErrors] does not catch them-->
<error statusCode="404" redirect="Error/Index" />
<error statusCode="403" redirect="Error/Index" />
</customErrors>
</system.web>