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

时间:2014-09-02 12:39:07

标签: asp.net-mvc routes http-status-code-404 custom-error-pages

我正在尝试在ASP.NET MVC 5中实现自定义错误页面。如果我输入了无效的URL,则自定义错误页面将在大多数时间显示我的自定义404未找到页面,并且回复正确“404 not found” ,但在某些情况下,它使用我的自定义500内部服务器错误页面响应“500内部服务器错误”??

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

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

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

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 ?????

3 个答案:

答案 0 :(得分:2)

弄清楚出了什么问题。我认为它与路由配置有关,但问题实际上在我的LINQ表达式中。

我用过

.Single()

返回一个帖子,所以必须有1个帖子返回而不是0.当我去了没有帖子的网址时,有0个帖子,所以它会抛出内部服务器错误而不是找不到错误。

我把它改成了

.SingleOrDefault()

所以期望值可以是单个(1)或默认值(0),现在它抛出404未找到错误,这就是我想要的。

答案 1 :(得分:1)

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

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

希望这会有所帮助:)

答案 2 :(得分:1)

您收到500内部服务器错误,因为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); } 您收到的实际错误消息是什么,以及你的行为是什么样的?

您如何处理无法找到相关帖子的事实?我猜你自己没有得到任何回复,然后摔倒。

你有没有试过像:

{{1}}