2016-05-19 2 views
3

jsonでエラーが発生した400ステータスコードを返すのに奇妙な問題があります。ステータスコード400(.net)のJSONを返さないサーバー

  if(!ModelState.IsValid) 
      { 
       string[] errors = ModelState.Values 
             .SelectMany(x => x.Errors) 
             .Select(x => x.ErrorMessage).ToArray<string>(); 

       Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; 
       return Json(new { success = false, errors = errors }, JsonRequestBehavior.DenyGet); 
      } 

これは私の開発マシン上で正常に動作します:私のコントローラで

は、私のようなものを持っています。私はajaxエラーメソッドでエラーを取得できます。しかし、サーバーにデプロイすると、サーバーはJSONを返さなくなります。私はいつもreponseJSONの代わりにresponseTextを取得します。私はResponse.StatusCodeを削除する場合、それは正常に動作します。

これは、ResponseオブジェクトのStatusCodeプロパティを設定したときに関数が返されると考えています。これは誰にも起こったのですか?誰もが解決策を知っていますか?

+0

これを行うには 'JsonRequestBehavior.AllowGet' – Bharadwaj

答えて

4

私はついにこの問題が何かを理解しました。これをここに掲示すると、これ以上自分の髪を引っ張っているかもしれない人のための答えとして。

は、次のように設定します。

Response.TrySkipIisCustomErrors = true; 

あなたはステータスコードを設定し前に、これはに設定されていることを確認してください。また、なぜ私のローカルマシン上で動作していたのかテスト/ uatサーバ上で動作していないのかもわかりました。 web.configでは、CustomErrorsオフに設定されていましたが、サーバーではに設定されていました。

はすぐにそれがResponseに書き込まれているBadRequestステータスコードを見ていると「を返し」サーバーのように思えます。

+0

素晴らしい!あなたはIIS 10の下でそれを必要としませんが、それでもIIS 7の下でそれを必要とします。少なくともこれは私の経験です(不一致はお尻の痛みで、開発と生産の間を移動すると予期せぬ問題が発生します) –

0

明示的にキャストしていても、Response.StatusCodeはResponseの子要素です。多くの場合

、私が見つけ、WebAPIの者を作成するための "ベストプラクティス" を以下の最も簡単な方法:

public JsonResult Action() { ... }

まず、あなたのメソッドのシグネチャから変更しますpublic IHttpActionResult Action { ... }

Json()の代わりに次のSE:

return Content(HttpStatusCode.BadRequest, new {success = false, errors = errors }, Configuration.Formatters.JsonFormatter);

final変数、Configuration.Formatters.JsonFormatterはオプションです - JSONは、デフォルトの戻り値の型である(またはASP.NETはコンテンツネゴシエーションを可能にし、どのようなクライアントに従います、覚えておいてくださいリクエスト)。

希望に役立ちます。

+0

ねえ、ありがとう。残念ながら、私はすでにそれを試みていたし、うまくいきませんでした。私は答えとして、最終的には何を追加しました。私があなたが言及したことのための「ベストプラクティス」の源を知りたいのですが。 –

+0

@JeevanJose興味深いですが、上記のコードを使用していた問題は何ですか?同じ正確なバグ?最善の方法については、ほとんどの.NETエキスパートがAPIを作成する際に推奨されるものに基づいています(Shawn Wildermuth on Pluralsightには特に優れたものがいくつかあります):https://app.pluralsight.com/library/courses/ web-api-design /目次https://app.pluralsight.com/library/courses/implementing-restful-aspdotnet-web-api/table-of-contentsそして最後にhttps://app.pluralsight。 com/library/courses/aspdotnet-bestpractices-models/table-of-contents)を参照してください。 –

関連する問題