1. ホーム
  2. asp.net

[解決済み] ASP.NET MVCのアクションからHTTP 404レスポンスを送信する適切な方法は何ですか?

2023-03-07 17:06:29

質問

ルートが与えられたら。

{フィード名}/{アイテムパーマリンク}。

ex: /ブログ/ハローワールド

項目が存在しない場合、404を返したいです。ASP.NET MVCでこれを行うには、正しい方法は何ですか?

どのように解決するのですか?

カウボーイ・コーディング(cowboy coding ;-))で、私はこのようなことを提案します。

コントローラです。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return new HttpNotFoundResult("This doesn't exist");
    }
}


HttpNotFoundResultです。

using System;
using System.Net;
using System.Web;
using System.Web.Mvc;

namespace YourNamespaceHere
{
    /// <summary>An implementation of <see cref="ActionResult" /> that throws an <see cref="HttpException" />.</summary>
    public class HttpNotFoundResult : ActionResult
    {
        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with the specified <paramref name="message"/>.</summary>
        /// <param name="message"></param>
        public HttpNotFoundResult(String message)
        {
            this.Message = message;
        }

        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with an empty message.</summary>
        public HttpNotFoundResult()
            : this(String.Empty) { }

        /// <summary>Gets or sets the message that will be passed to the thrown <see cref="HttpException" />.</summary>
        public String Message { get; set; }

        /// <summary>Overrides the base <see cref="ActionResult.ExecuteResult" /> functionality to throw an <see cref="HttpException" />.</summary>
        public override void ExecuteResult(ControllerContext context)
        {
            throw new HttpException((Int32)HttpStatusCode.NotFound, this.Message);
        }
    }
}
// By Erik van Brakel, with edits from Daniel Schaffer :)

このアプローチを使用すると、フレームワークの標準に準拠することになります。そこにはすでに HttpUnauthorizedResult があるので、後であなたのコードをメンテナンスする別の開発者の目には、これは単にフレームワークを拡張することになります (あなたの住む場所を知っている精神異常者のことです)。

このアプローチが何かを見逃しているかどうかわからないので、HttpUnauthorizedResult がどのように達成されるかを見るためにアセンブリを調べるために reflector を使用できます (ほとんど単純すぎるようです)。


私はちょうど今HttpUnauthorizedResultを見てみるためにreflectorを使用しました。彼らは、応答の StatusCode を 0x191 (401) に設定しているようです。401の場合はうまくいくのだが、404を新しい値として使うと、Firefoxでは空白のページが表示されるだけになってしまうようだ。Internet Explorerでは、デフォルトの404が表示されます(ASP.NETバージョンではありません)。Webdeveloperツールバーを使って、FFのヘッダーを検査したところ、404 Not Foundレスポンスが表示されました。単に私がFFで間違って設定したものである可能性があります。


とは言うものの、Jeff のアプローチは KISS の良い例だと思います。このサンプルで冗長性を必要としないのであれば、彼の方法も同様にうまく機能します。