2016-11-12 10 views
1

私は、ASP.NET Web API 2を中央サーバーとして使用するWPFクライアントを使用しています。ステータスで、私はこの方法をステップ実行すると、それはreturn Ok(persons);に出て要求が成功したように見えるIsSuccessStatusCodeの値がfalseになるのはなぜですか?

[HttpPost] 
public IHttpActionResult Get() 
{ 
    IEnumerable<Person> persons; 
    try 
    { 
     persons = Db.People.ToList(); 
    } 
    catch (Exception ex) 
    { 
     return new ExceptionResult(ex, this); 
    } 
    return Ok(persons); 
} 

、と私は応答がIsSuccessStatusCode == falseを持つWPFクライアント、に戻り、次の午前デバッグ:ウェブAPIでは、私はこのアクションを持っています"500 Internal Server Error"と何らかの理由で応答が何も表示されませんでしたか?

私は、一般的な方法でこのアクションを呼び出す:

People = await Rest.PostAsync<IEnumerable<Person>>("/api/Persons"); 
... 
public async Task<TReturn> PostAsync<TReturn>(string resource) 
{ 
    var exMsg = $"Post request failed to get resource: '{resource}' from '{Client.BaseAddress}'."; 
    try 
    { 
     HttpResponseMessage response = await Client.PostAsync(resource, null); 
     if (!response.IsSuccessStatusCode) 
     { 
      Logger.Error(exMsg); 
      RaiseException(response, exMsg); 
     } 
     return JsonConvert.DeserializeObject<TReturn>(await response.Content.ReadAsStringAsync()); 
    } 
    catch (Exception ex) when (ex.GetType() != typeof(RestClientException)) 
    { 
     Logger.Error(ex, exMsg); 
     throw; 
    } 
} 

私はそれが失われることに応じて情報を原因と信じてリードしてきたので、私は醜い、毛布response.EnsureSuccessStatusCode()を使用しないでください。

DataGridのコードを除いてコード変更なしでこれはまだ動作していましたが、何とかデータベース内のデータは変更したが、ソリューションのデータモデルコンポーネントは変更しなかったという事実。データ値だけを入力してから、アクションメソッドのToList()がすべてのデータグレムリンを木工から引き出します。

私は唯一の500は、コントローラとクライアントの間で起こるHTTPを把握することができ、そして私が間違っている可能性が何を求めている、とどのように私はそれを診断することができますか?

+0

はなぜuが取得できませんポストを使用していますか? – aguetat

+0

@aguetatある時間前に私は学んだ。いくつかの理由から、ポストはAjaxにとってより安全であることを思い出さない。 MVCでは、 'JsonResult'クラスも、彼らが得るあり、そしてあなたが「AllowGet」 – ProfK

+0

Uとそのデフォルトを上書きしていない場合はJSONレスポンスを期待して、ほぼすべての要求が失敗することを期待し、その' DenyGet'デフォルトは 'JsonRequestBehavior'性を有していますあなたのアクションの名前を変更する必要があります。あなたが "Get"と呼ぶとき、フレームワークはそれをGetアクションのようにみなします。 – aguetat

答えて

1

愚かなRestSharpは、戻り値の型パラメーターをIEnumerable<T>としたときに、「インターフェイスをインスタンス化できませんでした」と訴えていました。それをList<T>に変更し、うまくいきました。そして、無用なライブラリを、純粋でクリーンなHttpClientに置き換えました。これは、その応答内容を「インターフェースタイプ」にデシリアライズすることができます。

0

それが「OK戻る」ラインに細かい実行され、そして人口「人物」がある場合、私はこの問題は、Personオブジェクトをシリアライズしてあることを期待します。
例えば、無限ループを作成する可能性のある他の "Person"エンティティを参照するプロパティを持っていますか?

私は、私は私がGetリクエストで呼び出すことができます別のエンドポイントを作成して、私はかなり簡単にエラー応答が表示されるように、ブラウザを使用して要求をするだろうことができれば。

関連する問題