1

application/jsonContent-type ヘッダーでリクエストを使用して呼び出されるアクションがあります。これらのリクエストは、リクエストのコンテンツを逆シリアル化しようとする JsonValueProvider を自動的に作成します。json の形式が正しくない場合、値プロバイダーはアプリケーションのエラー ページにつながる例外をスローします。

この動作を再現するにapplication/jsonは、Content-type ヘッダーとして送信するアクションに無効な json データを単純に POST します。これにより、例外がトリガーされます。

[編集]

多くのコードは必要ありません。空のコントローラー メソッドを作成し、Firefox の「Poster」などのツールを使用して、無効なリクエストをアクションに送信するだけです。

public class HomeController
{
    public ActionResult Index()
    {
        return this.Json(true);
    }
}

次に、ポスターを使用します。

  • コンテンツタイプをに設定application/json
  • リクエスト内容を{"This is invalid JSON:,}
  • リクエストを送信

その結果、本格的な標準の ASP.NET HTML エラー ページが表示されます (アプリケーションに応じて、汎用またはカスタム)。

[/編集]

私のアクションは組み込みデバイスによって呼び出されるため、HTML エラー ページの代わりに短い応答を送信したいと考えています。text/plainステータス コード 500、 Content-type: 、およびコンテンツとしての例外のメッセージを含む応答を作成できるようにしたいと考えています。

カスタム モデル バインダーとカスタム エラー ハンドラー属性を既に試しましたが、処理パイプラインの早い段階で例外が発生したため、どちらも呼び出されませんでした。このエラーを処理する方法はありますか?

回避策として、私は現在、アプリケーション全体で JsonValueProvider を無効にし、リクエストの本文から自分で値をロードしています。アクションごとに JsonValueProvider を無効にする方法があれば、これも役立ちます。

ご指摘ありがとうございます。

4

1 に答える 1

0

Global.asax で Application_Error イベントをサブスクライブし、必要に応じて例外を処理できます。

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    Response.TrySkipIisCustomErrors = true;
    Response.Clear();
    Server.ClearError();
    Response.StatusCode = 500;
    Response.ContentType = "text/plain";
    Response.Write("An error occured while processing your request. Details: " + exception.Message);
}
于 2013-06-07T11:01:07.433 に答える