1

Im、ASP.NET MVCおよびASP.NET WEB APIを使用してSOAプロジェクトに取り組んでいます。両方のプロジェクトは異なるソリューションの中にあるので、私たちはmvcサイトとWeb APIサイトを持ち、mvcサイトはhttpメソッド操作を使ってWeb APIサイトを呼び出します。ASP.NET MVCコントローラーからASP.NET Web APIコントローラーにデータをポストするときに保留中の要求

このシナリオを念頭に置いて、mvcコントローラからWeb APIにデータをポストするときに、奇妙な動作に直面します。 GET操作を行うと、すべて正常に動作します。ここでイムがやって何:Create.cshtml内部

> JSコード:

var create = (function() { 
var _init = function (container, starter, url) { 
    $(starter).autocomplete({ 
     minLength: 3, 
     focus: function() { 
      return false; 
     }, 
     select: function (event, ui) { 
      var terms = this.value.replace(" ", "").split(','); 

      terms.pop(); 

      terms.push(ui.item.label); 

      terms.push(""); 

      this.value = terms.join(","); 
      return false; 
     }, 
     search: function (event, ui) { 
      if (_extractLast(this.value).length < 3) 
       return false; 

      return true; 
     }, 
     source: function (request, response) { 
      _execute(request, response, url); 
     } 
    }); 
}; 
var _extractLast = function (term) { 
    var termArray = term.split(','); 
    var lastTerm = termArray[termArray.length - 1]; 
    return lastTerm.replace(' ', ''); 
}; 
var _execute = function (request, response, url) { 
    var responseCallback = response; 
    $.ajax({ 
     url: '\Comunication\Contacts', 
     async: true, 
     type: 'POST', 
     dataType: 'json', 
     data: { termo: _extractLast(request.term) }, 
     success: function (data) { 
      responseCallback($.map(data, function (item) { 
       return { label: item.Name, value: item.Id } 
      })); 
     } 
    }); 
} 
return { init: _init };})(); 

私CSHTMLビュー内

、私は私のMVCコントローラへのAJAX呼び出しを行うjsのコードを持っています私のコントローラーの内部からは、特化したサービスレイヤーからのメソッドを呼び出して、SOAのことをしている私のWEB APIサイトにPOST要求を行います。

> MVCコントローラーコード:

public class ComunicationController : BaseController{ 
    [HttpPost] 
    public async Task<JsonResult> Contacts(string termo) 
    { 
     var contacts = new ContactServices.ConsumeAsync(new ContactParameter{Term: termo}); 
     return Json(contacts, JsonRequestBehavior.AllowGet); 
    } 
} 

>レイヤのサービスコード:

public class ContactServices{ 
public async Task<List<ContactsDTO>> ConsumeAsync(ContactParameter parameter) 
{ 
    using (System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient()) 
    { 
     httpClient.BaseAddress = new Uri("http://localhost:123456/api/comunication/contacts"); 
     httpClient.DefaultRequestHeaders.Accept.Clear(); 
     httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response = await httpClient.PostAsJsonAsync(new Uri("http://localhost:123456/api/comunication/contacts"), parameter); 
     return JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(response.Content.ReadAsStringAsync().Result).Result.data; 
    } 
} 

}

私のWeb APIのSITE要求を受け入れ、ここで予想、無懸念のようなプロセスの要求を。しかし、私のWEB API CONTROLLERからHttpResponseMessageをPOST操作でMVCサイトに返すと、要求応答はネットワークモニターに応じて永久に保留状態になります。ステータスが保留されていると私は決して要求応答を取得していない、HERESに写真です: Pending Status from My Post Request 私が言ったように、私は私のウェブAPIにリクエストをGET行うとき、すべてが正常に動作しますが、私はPOSTリクエストを行うときにこれが起こる...

答えて

1

あなたの問題はこの行にあります:

return JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(response.Content.ReadAsStringAsync().Result).Result.data; 

タスクのResultプロパティを使用すると、MVCコントローラのデッドロックが生成されます。 APIが非同期の場合、常にawaitというタスクが実行されます。

var content = await response.Content.ReadAsStringAsync(); 
var deserialized = await JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(content); 
return deserialized.data; 

あなたは非同期メソッドにブロックしてはならない理由についての詳細を学ぶためには、この偉大なポストを確認してください。
Don't Block on Async Code

+0

はどうもありがとうございます、あなただけの私の一日行わ。私はその細部に気付かなかった。それは本当に働いた、ありがとう! –

関連する問題