web-dev-qa-db-ja.com

Mvc.JsonResultに加えて、Response.StatusCodeを設定して返します

プロジェクト:ASP .net 4.0フレームワークで実行されているMVC 4:

VS 2010 Expressでアプリケーションを実行する(または、ローカルマシンでIIS 7.5でデプロイおよび実行する)場合、アクションからの次の(擬似コード)結果は期待どおりに動作します)

[HttpPost]
public ActionResult PostWord(Model model)
{
   ....
   Response.StatusCode = 400;
   Return new JsonResult { data = new {fieldName = "Word", error = "Not really a Word!" } };

(そして、JsonResultオブジェクトのContentTypeおよびContentEncodingプロパティを割り当てましたが、動作に違いはありません)

DeployableをWebホストに移動すると(IIS 7)を使用して、firebugは応答が期待どおり(400)であることを通知しますが、応答にJSONはありません(つまり、任意の種類のテキスト)。行を削除した場合

Response.StatusCode = 400;

アクションから、JSONはレスポンスで完全に形成されますが、もちろんレスポンスステータスコードは200(OK)であり、消費するJavaScriptと適切な関数呼び出しを妨害します。

何が起こっているのか、これを修正する方法についての考えはありますか?ありがとうございました

37
Brent

これとまったく同じ問題がありました。正しい答えがコメントに埋もれていないことを確認するために(私にとっては)、@ Sprockincatのコメントを繰り返したいと思います。

少なくとも私にとっては、IISカスタムエラーの問題であり、次の方法で解決できます。

Response.TrySkipIisCustomErrors = true;

@Sprockincat-あなたはこれに対する信用を得るべきです。診断するのが非常に難しい問題の微妙な修正であるため、私はそれをもっと見やすくしています。

52
Robert

HttpStatusCodeを指定できるJsonResultのサブクラスを作成しました。

public class JsonResultWithHttpStatusCode : JsonResult
{

    private int _statusCode;
    private string _statusDescription;

    public JsonResultWithHttpStatusCode(object data, HttpStatusCode status) 
    {
        var code = Convert.ToInt32(status);
        var description = HttpWorkerRequest.GetStatusDescription(code);
        Init(data, code, description);
    }

    public JsonResultWithHttpStatusCode(object data, int code, string description)
    {
        Init(data, code, description);
    }

    private void Init(object data, int code, string description)
    {
        Data = data;
        _statusCode = code;
        _statusDescription = description;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.StatusCode = _statusCode;
        context.HttpContext.Response.StatusDescription = _statusDescription;
        base.ExecuteResult(context);
    }
}

その後、これを結果として返すことができ、ステータスコードが応答に設定されます。テストの結果でステータスコードをテストすることもできます。

2
Richard Garside