2016-12-23 1 views
1

POSTとGETの両方でWebAPI非同期を呼び出すMVCアプリケーションがあります。 WebAPIとMVCの両方のアプリケーションをローカルで実行すると、WebAPIの応答は正常に表示されますが、SendAsync要求は500を返します。また、FiddlerはAPI呼び出しを表示しません。私はそれが非同期要求がどのように処理されているのかとの疑問を持っていますが、私は何が欠けているのか分かりません。 APIへWebAPIは200を返しますが、SendAsync呼び出しは500を示します

MVCコントローラのコール:

public Model UploadFile(Model formCollection) 
{ 
    var documentModel = formCollection.ToString(); 

    var client = new HttpClient(); 
    var uri = new Uri(BaseUri + "document/"); 

    var content = new StringContent(documentModel); 

    var request = new HttpRequestMessage(HttpMethod.Post, uri) {Content = content}; 

    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

    var response = client.SendAsync(request); 
    response.Wait(); 

    try 
    { 
     var returned = response.Result; 
     if (returned.StatusCode != HttpStatusCode.OK) 
     { 
      throw new Exception(returned.RequestMessage.ToString()); 
     } 

     var model = JsonConvert.DeserializeObject<Model> (returned.Content.ReadAsStringAsync().Result); 
     model.FileContents = ""; 

     return model; 
    } 
    catch(Exception e) 
    { 
     var error = new Exception("Service failure - ", e); 
     throw error; 
    } 
} 

WebAPIのポスト:

[HttpPost] 
public async Task<HttpResponseMessage> Post([FromBody]Model model) 
{ 
    var response = await SubmitNew(model); 

    return Request.CreateResponse(response); 
} 

ポストで返却にブレークポイントを設定するには、有効な応答を示すが、response.Result中に私はさらに、以下のようなレスポンスに関係なく、OKリクエストを返そうとしました:

return Request.CreateResponse(HttpStatusCode.OK, result); 

クライアントが500を表示している理由に関するアイデアはありますか?

+0

ラップvar response = client.SendAsync(request); try-catchブロックで例外を参照してください。 – Daniel

+0

エラー500は、WebAPIで何かが正しく設定されていないことを意味します。 WebAPIの簡単なメソッドで、APIが動作していることを確認するのに役立つテスト方法がありますか? – Dalorzo

+1

この呼び出しを行うにはPOSTMAN/Advanced restクライアントを使用してください。 – Shyju

答えて

1

最初のPOSTとGET呼び出しの結果後に発生していたWebAPIのログサービスにタイムアウトエラーがありました。問題は解決されました。

1

あなたのGlobal.asax.cs

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     // Try adding the following lines: 
     var configuration = GlobalConfiguration.Configuration; 
     var formatters = configuration.Formatters; 
     formatters.Clear(); 
     formatters.Add(new JsonMediaTypeFormatter()); 
    } 

    // A good idea to have this: 
    protected void Application_Error() 
    { 
     Exception unhandledException = Server.GetLastError(); 
     // Set a breakpoint here or do something to log the exception 
    } 

でコードがApplication_Startに追加し、そのシリアル化だけに/ JSONからであることを確認します。最終的なコードではそれが望ましいものではないかもしれませんが、問題の原因を特定するための一時的な手段として役立ちます。

Application_Errorを追加すると、コントローラメソッドから返されたオブジェクトをシリアル化するときなど、WebAPIレイヤ内で発生する問題を捕捉するのに役立ちます。

私の疑問は、SubmitNewが、無限に再帰的な参照(例:相互参照を持つ親子構造体)など、直列化できないものを返すということです。

関連する問題