我在我的网站上设置了自定义错误页面
<customErrors mode="RemoteOnly" defaultRedirect="~/Error">
<error statusCode="500" redirect="~/Error/InternalError"/>
<error statusCode="404" redirect="~/Error/FileNotFound"/>
<error statusCode="403" redirect="~/Error/AccessDenied"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)
但是,在供应商网站上还有另一个区域,当供应商区域发生错误时,重定向将转到供应商/错误/ _.由于我这里没有任何错误页面,网站似乎挂起从不显示错误页面.如何在不必将错误页面复制到供应商区域的情况下解决此问题?
如果 url 不存在,我需要将用户重定向到页面未找到的页面。如果用户复制 url 并将其粘贴到 rbowser 上,则页面显示页面未找到方法。
在这我需要将用户重定向到页面未找到页面
我有一个带有自定义StructureMap控制器工厂的ASP.NET MVC 2应用程序来处理我的控制器的依赖注入:
public class StructureMapControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext context, string controllerName)
{
Type controllerType = base.GetControllerType(context, controllerName);
return ObjectFactory.GetInstance(controllerType) as IController;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在这个控制器工厂中处理异常,以便它们可以像在具有HandleError属性的控制器中一样重定向到〜/ Views/Shared/Error.aspx.尽管将CustomErrors属性设置为"On",但目前异常不会执行此操作.
目前我可以使用像"〜/ DoesNotExist/edit/1"这样的URL生成这样的异常.使用默认路由:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)
MVC匹配此路由并将控制器名称"DoesNotExist"传递给我的控制器工厂.GetControllerType然后返回null并在对StructureMap的调用中导致空引用异常.然后我希望能够处理这个异常.
请注意,添加后续捕获所有路由将无法解决此问题 - MVC匹配默认路由.
我知道我可以通过在控制器的默认路由上设置约束来解决这个特殊问题,但问题是如何在工厂中使用普通的MVC~/Views/Shared/Error.aspx.
请注意,我不希望答案要求将控制器工厂紧密耦合到特定的MVC应用程序.理想情况下,此工厂应位于不在同一解决方案中的引用程序集中.
我正在构建我的第一个ASP.NET MVC网站,我正在试图弄清楚如何实现404页面.
我应该创建一个名为"404Controller?"的控制器吗?如果是这样,我如何在IIS中注册此控制器,以便将404重定向到该页面?此外,在某些其他控制器代码未找到某些内容(例如,在数据库中)的情况下,如何将请求重定向到我的404页面?
我在global.asax的底部有以下路由:
//404 ERRORS:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Error", action = "PageNotFound" }
);
Run Code Online (Sandbox Code Playgroud)
哪个在Visual Studio中工作正常,但在生产中我得到了IIS错误页面.
这条路线不应该捕获任何未被其他人捕获的URL,因此从IIS的角度来看没有404吗?我还需要在web.config中做些什么吗?
注:我不希望重定向到一个404特定URL; 而是我在请求的URL上提供404错误页面(我认为从可用性的角度来看这是正确的方法).
更新
在我的错误控制器中,我正在设置Response.StatusCode = 404;,这似乎是问题.当我删除它并再次部署到生产时,我再次获得友好的错误页面.但是,我相信我确实需要HTTP标头中的404状态 - 出于搜索引擎优化的目的 - 所以现在我的问题变为:
修订问题
IIS如何/为什么拦截响应并发送其开箱即用的404错误,我该如何防止这种情况?
**解决方案**
Dommer获得奖品以表明Response.TrySkipIisCustomErrors=true;哪些(我认为)是必要的.但还有另外两个关键细节:
让它在任何地方工作
由于某些URL可能会映射到"404-PageNotFound"以外的路由但包含无效参数,并且由于我不想重定向到404页面,因此我在基本控制器中创建了此操作:
[HandleError]
public ActionResult NotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));
}
Run Code Online (Sandbox Code Playgroud)
并且在任何继承基础的控制器动作中,每当我捕获无效的路由参数时,我只需要调用它:
return NotFound();
Run Code Online (Sandbox Code Playgroud)
注意:不是 RedirectToAction()
锦上添花:
我生成并传递到视图中的模型是将URL的多余部分输入到我们的搜索引擎中,并在友好的404页面上显示前3个结果作为建议.
我的小ASP.NET MVC应用程序收到了很多关于伪装"setup.php"页面的请求(每周容易200多个).我猜这是一些试图在网络上发现易受攻击的网站的机器人.这不是一个大问题,但它确实倾向于用垃圾填满我的错误日志,并且可能更难找到需要修复的实际问题.
我想要做的是创建一个路径来处理所有.php请求(以及可能的其他明显虚假的扩展)并以某种方式处理它们.什么是太棒了将立即中止请求,以便我的应用程序不会浪费时间/带宽创建和发送响应(即使它只是一个404).此外,假设这些是恶意请求,那么让他们的服务器坐下来等待超时而不是立即响应并快速继续尝试别人的服务器会很棒:)
所以,我想这是一个2部分的问题.
是否可以在不发送响应的情况下直接停止在ASP.NET/MVC中处理请求
这个问题有更好的解决方案吗?
我正在我的MVC3应用程序中实现自定义错误,它在web.config中打开:
<customErrors mode="On">
<error statusCode="403" redirect="/Errors/Http403" />
<error statusCode="500" redirect="/Errors/Http500" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)
我的控制器非常简单,具有相应的正确命名视图:
public class ErrorsController : Controller
{
public ActionResult Http403()
{
return View("Http403");
}
public ActionResult Http500()
{
return View("Http500");
}
}
Run Code Online (Sandbox Code Playgroud)
为了测试,我在另一个控制器中抛出异常:
public class ThrowingController : Controller
{
public ActionResult NotAuthorised()
{
throw new HttpException(403, "");
}
public ActionResult ServerError()
{
throw new HttpException(500, "");
}
}
Run Code Online (Sandbox Code Playgroud)
403工作 - 我被重定向到我的自定义"/错误/ Http403".
500不起作用 - 我被重定向到共享文件夹中的默认错误页面.
有任何想法吗?
我的问题是关于Pure.Kromes对这篇文章的回答.我尝试使用他的方法实现我的页面的自定义错误消息,但有些问题我无法解释.
a)当我通过输入无效的URL(例如localhost:3001/NonexistantPage)引发404错误时,它默认为我的错误控制器的ServerError()Action,即使它应该转到NotFound().这是我的ErrorController:
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.NotFound;
var viewModel = new ErrorViewModel()
{
ServerException = Server.GetLastError(),
HTTPStatusCode = Response.StatusCode
};
return View(viewModel);
}
public ActionResult ServerError()
{
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var viewModel = new ErrorViewModel()
{
ServerException = Server.GetLastError(),
HTTPStatusCode = Response.StatusCode
};
return View(viewModel);
}
}
我在Global.asax.cs中的错误路由:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
name: "Error - 404",
url: "NotFound",
defaults: …Run Code Online (Sandbox Code Playgroud) 我试图在我的MVC4网站上配置Magical Unicorn Mvc Error Toolkit(v 2.1.2),但我无法让它工作.这是我的代码:
Web.config文件
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/ServerError">
<error statusCode="404" redirect="~/Views/Error/NotFound.cshtml" />
</customErrors>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="404" path="~/Error/NotFound" responseMode="ExecuteURL" />
<error statusCode="500" path="~/Error/ServerError" responseMode="ExecuteURL" />
</httpErrors>
<system.webServer>
Run Code Online (Sandbox Code Playgroud)
错误控制器
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
[这些是基于这个/sf/answers/524958451/帖子]
CustomerErrorHandler.cs(App_Start)
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using WorldDomination.Web.Mvc;
using CustomErrors.App_Start;
[assembly: WebActivator.PreApplicationStartMethod(typeof(CustomErrorHander), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用路由构建我的教程项目。我的主要目标是构建两条在任何情况下都不会产生 404 错误的路由。我的意思是,如果路径错误,我希望路由使用 /Home/Index 路径。我有以下两条路线 -
routes.MapRoute("Default", "{controller}/{action}",
new {controller = "Home", action = "Index"}
);
routes.MapRoute("Second", "{*catchall}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
Run Code Online (Sandbox Code Playgroud)
当我使用与第一条路线不匹配的不存在的路径时,它工作正常,就像这样 -
但如果是这样,那么我有以下几点——
或者
我明白它发生的原因。但是目前,我只能设法找到“某种”解决方案。将以下代码添加到 web.config 文件 -
<customErrors mode="On">
<error statusCode="404" redirect="~/Home/Index"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)
但是,我认为这不是解决此问题的最佳方法。因为,据我所知,它只是捕获所有错误并将其重定向到正确的路径,而不实际使用路由。所以我认为我不需要这种全局处理。
所以有人可以给我一个提示或为我提供一个很好的解决我的问题的方法。谢谢你。