在尝试让我的应用程序正确生成404错误时,我在路由表的末尾实现了catch all route,如下所示:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
Run Code Online (Sandbox Code Playgroud)
但是,为了使这个工作,我不得不删除默认路由:
{controller}/action/{id}
Run Code Online (Sandbox Code Playgroud)
但是现在已经删除了默认设置,我的大部分操作链接都不再有效,而我找到让它们再次工作的唯一方法是为每个控制器/操作添加单独的路由.
是否有更简单的方法,而不是为每个控制器/操作添加路由?
是否可以创建一个默认路由,如果用户尝试导航到未知路由,仍然允许捕获所有路由?
是否有可能创建一个捕获所有的最终路由...并将用户弹回到ASP.NET MVC中的404视图?
注意:我不想在我的IIS设置中进行此设置.
我目前正在生产服务器上部署使用MVC ASP.NET的RC构建的应用程序,现在什么都没有显示.我的global.ascx中的路由是典型的
routes.MapRoute(
"Default", // Route name
"{controller}.aspx/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
Run Code Online (Sandbox Code Playgroud)
任何人都可以弄明白为什么它只显示空白页面
对不起,我忘了提到它是IIS 6
有趣的是它也在我的本地IIS上工作(即本地内置的VS和标准的XP)
如果用户没有正确的权限,我想生成一个401页面.
用户请求一个URL并被重定向到登录页面(我在web.config中拒绝所有匿名).用户成功登录并重定向到原始URL.但是,在权限检查时,确定用户没有所需的权限,因此我想生成401.但是表单身份验证始终处理401并将用户重定向到登录页面.
对我来说,这是不正确的.用户已经过身份验证,用户只是没有正确的授权.
在其他场景中,例如在ajax或REST服务场景中,我绝对不希望登录页面 - 我需要正确的401页面.
到目前为止,我已经尝试使用自定义授权过滤器来返回ViewResult 401但无法正常工作.然后,我尝试了一个正常的动作过滤器,覆盖OnActionExecuting,它也不起作用.
我能做的是处理global.asax,PostRequestHandlerExecute中的事件,并检查权限,然后直接写回响应:
if (permissionDenied)
{
Context.Response.StatusCode = 401;
Context.Response.Clear();
Context.Response.Write("Permission Denied");
Context.Response.Flush();
Context.Response.Close();
return;
}
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是我想要的.首先,我甚至不确定这是否是正确的事件或管道中的地方.其次,我希望401页面有更多内容.优选地,它应该是aspx页面,其可能与站点的其余部分具有相同的母版页.这样,浏览网站的任何人都可以看到权限被拒绝但具有相同的外观和感觉等,但是ajax或服务用户将获得正确的状态代码来执行操作.
知道如何实现这一目标吗?我见过其他类似请求的帖子,但没有看到我可以使用的解决方案.
不,我不想要403.
我正在寻找一种标准方法来处理asp.net mvc 2.0或3.0中的错误
我有一个ASP.NET MVC 2应用程序,它在global.asax中有一个Application_Error事件处理程序.在这里,我正在检测Exception类型是HttpException并且HTTP代码是404的情况,并重定向到我自己的404处理页面.
这在我的Cassini开发服务器上工作正常,但现在我正在尝试将其移动到具有IIS7的生产服务器(使用集成模式).
当我请求一个不存在的URL时,IIS7显示自己的404页面,据我所知,我的Application_Error方法永远不会被调用.
我该如何解决这个问题?
我有一个自定义HandleError属性来处理MVC管道上的错误; 我有一个protected void Application_Error(object sender, EventArgs e)方法Global.asax来处理来自管道外部的错误.
我遇到过一个我不知道可能的情景; 在实现DI时,存在对a的依赖性connectionString,该依赖性取自应用程序配置文件.
由于连接字符串尚不存在,因此在创建控制器时会出错,这通常会使Application_Error处理程序触发,并呈现正确的错误页面(通过将部分视图呈现为字符串并将其作为响应发送,以防万一这失败了它只是写了"致命异常."的回应.
除了在这种情况下,我得到了虚假的默认ASP.NET"运行时错误"黄色死亡屏幕.告诉我:
运行时错误
说明:服务器上发生应用程序错误.此应用程序的当前自定义错误设置可防止查看应用程序错误的详细信息.
详细信息:要在本地服务器计算机上查看此特定错误消息的详细信息,请在位于当前Web应用程序根目录中的"web.config"配置文件中创建标记.然后,此标记应将其"mode"属性设置为"RemoteOnly".要使详细信息可在远程计算机上查看,请将"mode"设置为"Off".
我没有defaultRedirect设置customErrors,也没有设置Off,因为我不想重定向,而是在用户所在的同一页面上呈现错误,避免了不必要的重定向.
我该如何处理这样的场景?甚至是什么原因导致它以这种方式运行而不像控制器之外的任何其他错误?
我意识到它不太可能经常发生,但我希望能够阻止YSOD(部分原因是因为我想隐藏我正在使用的技术,但主要是因为它不是很漂亮,也不是用户友好的)
我甚至尝试为UnhandledExceptions注册一个处理程序,但它也没有触发.
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Run Code Online (Sandbox Code Playgroud)
最终产生这个的代码是:
return ConfigurationManager.ConnectionStrings[key].ConnectionString;,这里ConnectionStrings[key]是null.
更新
这是应用程序错误的处理方式:
protected void Application_Error(object sender, EventArgs e)
{
this.HandleApplicationError(new ResourceController());
}
public static void HandleApplicationError(this HttpApplication application, BaseController controller)
{
if (application == null)
{
throw new ArgumentNullException("application");
}
if (controller == null)
{ …Run Code Online (Sandbox Code Playgroud) 我在用
HttpContext.Current.Request.IsAjaxRequest()
Run Code Online (Sandbox Code Playgroud)
在Application_Error方法中检查global.asax中的ajax请求的条件,但是我收到以下错误:
'System.Web.HttpRequest'不包含'IsAjaxRequest'的定义和最佳扩展方法重载'System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest(System.Web.HttpRequestBase)'有一些无效的参数
以下是代码:
void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError().GetBaseException();
HttpException httpException = exception as HttpException;
string ErrorMessage = "";
ErrorMessage = "Application Level Error";
logger.Error(ErrorMessage, exception);
if (System.Web.HttpContext.Current.Request.IsAjaxRequest()) //if its an ajax do not redirect
{
return;
}
else
{
Server.ClearError();
this.Response.RedirectToRoute("Default", new { controller = "Home", action = "Error" });
}
}
Run Code Online (Sandbox Code Playgroud) 首先,快速完成我想要实现的目标:将特定异常转换为HTTP 404,以便ASP.NET可以进一步处理它.
我用这种方式处理ASP.NET(MVC2)中的异常:
protected void Application_Error(object sender, EventArgs e) {
var err = Server.GetLastError();
if (err == null)
return;
err = err.GetBaseException();
var noObject = err as ObjectNotFoundException;
if (noObject != null)
HandleObjectNotFound();
var handled = noObject != null;
if (!handled)
Logger.Fatal("Unhandled exception has occured in application.", err);
}
private void HandleObjectNotFound() {
Server.ClearError();
Response.Clear();
// new HttpExcepton(404, "Not Found"); // Throw or not to throw?
Response.StatusCode = 404;
Response.StatusDescription = "Not Found";
Response.StatusDescription = "Not Found";
Response.Write("The …Run Code Online (Sandbox Code Playgroud) asp.net error-handling application-error http-status-code-404
我正在使用ASP.NET MVC3和EF4构建一个简单的多用户(多租户?)应用程序,一个数据库,一个代码库,所有用户使用相同的URL访问应用程序.一旦用户登录,他们应该只能访问他们的数据,我使用默认的asp.NET成员资格提供程序,并在每个数据表上添加了"UserId"Guid字段.显然,我不希望用户A对用户B的数据有任何访问权限,因此我几乎在控制器上的每个操作中都添加了以下内容.
public ActionResult EditStatus(int id)
{
if (!Request.IsAuthenticated)
return RedirectToAction("Index", "Home");
var status = sService.GetStatusById(id);
// check if the logged in user has access to this status
if (status.UserId != GetUserId())
return RedirectToAction("Index", "Home");
.
.
.
}
private Guid GetUserId()
{
if (Membership.GetUser() != null)
{
MembershipUser member = Membership.GetUser();
Guid id = new Guid(member.ProviderUserKey.ToString());
return id;
}
return Guid.Empty;
}
Run Code Online (Sandbox Code Playgroud)
这种重复肯定是错误的,必须有一种更优雅的方式来确保我的用户无法访问彼此的数据 - 我缺少什么?
在 Global.asax 中,我们有一个名为 MvcApplication 的 System.Web.HttpApplication 类型的类,它代表应用程序,我们可以在其中处理各种事件。
我对 Application_Error 处理程序感兴趣。在这个处理程序中,我们可以使用类 MvcApplication 的所有属性。
-1-
'(MvcApplication)sender' 和 'this' 是同一个对象总是正确的吗?
protected void Application_Error(object sender, EventArgs e)
{
var httpApp = (MvcApplication)sender;
var equality1 = httpApp == this; // always true?
}
Run Code Online (Sandbox Code Playgroud)
-2-
获得错误的最佳方法是什么?以下示例返回相同的错误?
Exception ex0 = this.Context.Error;
Exception ex1 = httpContext.Error;
Exception ex2 = Server.GetLastError();
var equality3 = ex1 == ex2; // true?
Run Code Online (Sandbox Code Playgroud)