プロジェクト: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と適切な関数呼び出しを妨害します。
何が起こっているのか、これを修正する方法についての考えはありますか?ありがとうございました
これとまったく同じ問題がありました。正しい答えがコメントに埋もれていないことを確認するために(私にとっては)、@ Sprockincatのコメントを繰り返したいと思います。
少なくとも私にとっては、IISカスタムエラーの問題であり、次の方法で解決できます。
Response.TrySkipIisCustomErrors = true;
@Sprockincat-あなたはこれに対する信用を得るべきです。診断するのが非常に難しい問題の微妙な修正であるため、私はそれをもっと見やすくしています。
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);
}
}
その後、これを結果として返すことができ、ステータスコードが応答に設定されます。テストの結果でステータスコードをテストすることもできます。