繁体   English   中英

为什么ASP.NET MVC有时返回错误状态代码500,有时返回错误状态代码404

[英]Why ASP.NET MVC sometimes returns error status code 500 and sometimes error status code 404

我正在尝试在ASP.NET MVC 5中实现自定义错误页面。如果输入无效的URL,则自定义错误页面通常会显示我的自定义404找不到页面,并且正确的响应为“ 404 not found”,但是在在某些情况下,它会以我的自定义500内部服务器错误页面作为响应,并带有响应“ 500内部服务器错误”?

例如,我具有以下路由配置:

routes.MapRoute(
    null,
    "Category/{category}",
    new { controller = "Post", action = "Category" }
);

现在,如果我尝试导航到以下不存在的页面,它将响应404 not found错误,这是正确的。

justatestsite.com/Category/noexists(遵循正确的路由配置,页面不存在,错误状态为404)

justatestsite.com/Category/noexists/norouteconfig(不遵循正确的路由配置,页面不存在,错误状态为404)

但是与我的其他路由配置:

routes.MapRoute(
    null,
    "Archive/{year}/{month}/{day}/{title}",
    new { controller = "Post", action = "Detail" }
);

justatestsite.com/archive/2014/8/25/noexists(遵循正确的路由配置,页面不存在,错误状态为500)

justatestsite.com/archive/2014/8/25/noexists/norouteconfig(不遵循正确的路由配置,页面不存在,错误状态为404)

这是我的帖子详细信息控制器

public ViewResult Detail(int year, int month, int day, string title)
{
    var post = repository.Detail(year, month, day, title);

    if(post == null)
    {
        throw new HttpException(404, "Post not found");
    }

    if (post.Published == false && User.Identity.IsAuthenticated == false)
    {
        throw new HttpException(401, "The post is not published");
    }

    return View(post);
}

为什么有时会返回错误状态代码500 ????

找出问题所在。 我以为这与路由配置有关,但问题实际上出在我的LINQ表达式中。

我用了

.Single()

返回单个帖子,因此必须返回1个帖子,而不是0。当我转到其中没有任何帖子的url时,则为0个帖子,因此它引发了我内部服务器错误,而不是找不到错误。

我将其更改为

.SingleOrDefault()

所以期望值可以是single(1)或default(0),现在它抛出了404 not found错误,这就是我想要的。

您可以检查此博客以在ASP.NET MVC应用程序中实现自定义错误页面。 在这里,您将能够处理404找不到和500个内部服务器错误。

http://blog.janjonas.net/2011-12-11/asp-net-mvc3-custom-error-pages-non-ajax-requests-jquery-ajax-requests

希望这可以帮助 :)

您收到500个内部服务器错误,因为PostController上的Detail动作中有问题,您PostController的实际错误消息是什么,您的动作是什么样的?

您如何处理找不到相关帖子的事实? 我猜想您将没有任何回报可言,然后摔倒了。

您是否尝试过类似的方法:

public ActionResult Post(int year, int month, int day, string path)
{
  var publishedDate = new DateTime(year, month, day);

  BlogPost blog = _BlogRepository.GetBlogPost(publishedDate, path);

  if (null == blog)
  {
    throw new HttpException(404, "Blog post not found");
  }

  return View(blog);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM