Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 5中的自定义错误页_C#_Asp.net_Asp.net Mvc_Razor_Error Handling - Fatal编程技术网

C# ASP.NET MVC 5中的自定义错误页

C# ASP.NET MVC 5中的自定义错误页,c#,asp.net,asp.net-mvc,razor,error-handling,C#,Asp.net,Asp.net Mvc,Razor,Error Handling,我想将自定义错误页添加到我的项目中。 我发现并尝试实现它 因此: 我添加了404.cshtml,404.html,500.cshtml和500.html页面 在添加的cshtml文件中设置响应状态代码 将HandleErrorAttribute添加到全局筛选器的注释 更新我的web.config文件 但现在,当我试图通过路径http://localhost:120/foo/bar我的应用程序在哪里http://localhost:120我进入下一页: “/”应用程序中出现服务器错误 运行时错

我想将自定义错误页添加到我的项目中。 我发现并尝试实现它

因此:

  • 我添加了
    404.cshtml
    404.html
    500.cshtml
    500.html
    页面
  • 在添加的cshtml文件中设置响应状态代码
  • HandleErrorAttribute
    添加到全局筛选器的注释
  • 更新我的web.config文件
但现在,当我试图通过路径
http://localhost:120/foo/bar
我的应用程序在哪里
http://localhost:120
我进入下一页:

“/”应用程序中出现服务器错误

运行时错误

描述:处理您的请求时发生异常。此外,在执行第一个异常的自定义错误页时发生另一个异常。请求已被终止


我设置了你的重定向url不正确。将其设置为
~/404.html
~/500.html
。请注意,我将扩展名从
.cshtml
更改。确保文件存在并且指向正确的位置。

您使用的是什么版本的IIS?如果7+则使用
忽略自定义错误,并使用
。使用下面的方法,后者将显示您的错误页面,而不更改URL,IMO是处理这些事情的首选方法

设置错误控制器并将404和500放入其中,如下所示:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
    <error statusCode="500" path="/error/servererror" responseMode="ExecuteURL" />
 </httpErrors>

然后为每个包含的错误设置相应的视图。

我必须执行以下操作:

  • 从httpErrors中删除defaultPath,从customErrors中删除defaultRedirect
  • 确保我在Global.asax中注册了默认路由:

    routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { action = "Index", id = UrlParameter.Optional 
    });
    

  • 我不确定为什么第1步是必要的,第2步是因为我们在做EPiServer。

    您的
    httpErrors
    部分中的路径看起来可疑。为什么404的前缀是a/而不是500?为什么cshtml文件有根路径符号而html文件没有?您在不同的目录中有这些文件吗?我怀疑问题在于您试图使用
    .cshtml
    erro页面文件。这些是mvc视图,不应该这样称呼它们。请注意,在原始文章中,作者创建了.aspx页面,因为OP希望通过ASP.NET管道而不是MVC来处理错误。如果您确实想在MVC中处理这个问题,那么您的重定向应该是指向某个操作,而不是视图,比如
    /Error/Index
    directly@RonBeyer是的,对不起。在
    httpErrors
    中,这是我的打字错误。关于
    customErrors
    ——这是根据《华盛顿邮报》报道的。关于目录-不,所有这些页面都在共享中folder@Andrei,我也尝试使用
    .aspx
    页面,但错误仍然相同:
    运行时错误
    此示例的可能副本适用于我尝试测试的所有情况,只有一个例外。当我键入
    /foo/bar
    时,我会收到标准消息
    错误请求
    ,而不是我的自定义页面,如果我将
    默认路径
    默认响应模式
    添加到
    httpErrors
    中,这将显示带有500 errorHmmm的IIS页面…您可能需要
    [allowtml]
    关于控制器中的操作或编写自定义代码以全局捕获并在本地传递正确的错误,您可能仍会看到默认IIS页面中的错误,但生产服务器应该传递您的自定义页面。这让我困惑了好几个小时,谢谢!以下是为我节省时间的部分:
    Response.tryskipiiscustomerors=true
    
    public class ErrorController : Controller
    {
        public ActionResult servererror()
        {
            Response.TrySkipIisCustomErrors = true;
            Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            return View();
        }
    
        public ActionResult notfound()
        {
            Response.TrySkipIisCustomErrors = true;
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            return View();
        }
    
    }
    
    routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { action = "Index", id = UrlParameter.Optional 
    });