5

MVC 4 webAPI でのエラー処理で大きな問題に直面しています。ここでは、着信リクエストを検証し、BadRequest レスポンスを送り返したいと考えています。

そのために私はコードを使用しています

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
   if (item == null)
   {
     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
   }
   return item;
}

しかし、null IDの場合、VS2010は次のような別のエラーを生成します

「HTTP 要求の処理で例外が発生しました。詳細については、この例外の 'Response' プロパティによって返される HTTP 応答を参照してください」.

この問題を解決するにはどうすればよいですか

前もって感謝します....

4

4 に答える 4

3

あなたのコードは実際には正しいです。表示されているのは、未処理の例外 (アプリ内で未処理) のキャッチに対する Visual Studio の主張です。

HttpResponseException例外は、Web API を呼び出したルーティングによって処理され、コードは単純に 404 エラーを生成します。

コードを Web サーバーにインストールすると、一致するレコードが存在しない場合は単純に 404 エラーが返されます。

制約の使用に関する提案は基本的なチェックに役立ちますが、404 の実際の用途は、特定の要求エントリが (URL に存在しなかったというよりも) データベースに存在しなかったことを報告することです。

于 2013-05-24T07:56:35.487 に答える
2

ルート制約を使用してnullIDを無効にします@"\d+"。このように、URLに数値IDを渡さないと、コントローラーアクションは解決されず、ルーティングエンジンは直接404を返します。

于 2012-08-14T07:31:38.027 に答える
1

パラメータをintに変更するだけですか?次に、HasValue チェックを実行して、目的の例外をスローします。このように (同じ例外をスローしたい場合):

public Product GetProduct(int? id)
{
    Product item;
    if (id.HasValue){
        item = repository.Get(id);
    }
    if (item == null)
    {
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
    return item;
}
于 2013-09-11T09:48:22.090 に答える
0

http://www.asp.net/web-api/overview/error-handling/exception-handlingで説明されているように、キャッチされていない/ユーザーが処理していない例外は、デフォルトで HTTP 応答に変換されます。HttpResponseException をスローすると、この HTTP 応答の多く (404 Not Found ステータス コードなど) を指定できます。

TrueBlueAussie が述べたように、Visual Studio はこれらの例外で中断します。これを無効にするには:

  1. メニューから DEBUG -> Exceptions... に移動します。
  2. [例外] ダイアログで、"System.Web.Http.HttpResponseException" を共通言語ランタイムの例外ツリーに追加します。
  3. 新しい System.Web.Http.HttpResponseException の User-unhandled ボックスのチェックを外します。
于 2015-06-09T22:30:28.633 に答える