2013-06-19 4 views
36

プロジェクト:ASP MVC 4は、.NET 4.0フレームワークの下で実行されている:戻りMvc.JsonResultはプラス設定Response.StatusCode

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!" } }; 

を期待(私は行動に差がないと、のContentTypeと化するJsonResultオブジェクトのContentEncodingプロパティが割り当てられている)

展開がウェブ上に移動されるように動作しますホスト(IIS 7を使用)火かき棒は、応答が期待どおりであることを伝えています(400)が、応答にJSONはありません(つまり、テキストはありません)。私はアクションからライン

Response.StatusCode = 400; 

を削除する場合は、JSONは完全に対応して形成されているが、もちろん、応答ステータスコードがかかりJavaScriptと適切な関数呼び出しに干渉され、200(OK)です。

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

+0

なぜ400を返すのですか?これはちょうどフレンドリーなエラーメッセージのエラーページではありません – TGH

+0

http://stackoverflow.com/questions/6123425/rest-response-code-for-invalid-data多分私は物事を別々にすべきですが、JSONは関係なく返されます - レスポンスコードは、JSONで何をすべきかを知るために、ポストバック関数の情報を提供します。 200 to meは、「要求に応じて更新されたデータベース」を意味します。 – Brent

+0

HTTPステータスコード – TGH

答えて

47

私はまったく同じ問題を抱えていました。私にとって正しい答えがコメントに埋められていないことを確認するために、私は@ Sprockincatのコメントを再掲したい:

少なくとも私にとっては、それは確かにIISカスタムエラーの問題であった。

Response.TrySkipIisCustomErrors = true; 

@Sprockincat - あなたはこれを信用しているはずです。私はそれをより目に見えるようにしているのは、診断するのが非常に難しい問題に対するそのような微妙な修正だからです。

+0

ありがとう、非常に貴重! –

+2

@Robertもし私がこの回答を毎年upvoteすることができれば、私は次の年になるだろう!ありがとう!このfrikkinの問題は過去12時間掘り起こしていました!ありがとう、ありがとう、ありがとう、ありがとう。そしてオープニングポストのブレントに感謝します! –

+1

existingResponse = "Replace"はTrySkipIisCustomErrorsを無視するため、を追加する必要がありました! –

1

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); 
    } 
} 

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

関連する問題