2017-04-08 21 views
0

APIへの接続をテストするための簡単なコンソールアプリケーションを構築した。 Console App Mainから接続メソッドを呼び出すと正常に動作します。私はアクセストークンで応答します。APIへのSendAsync後にMVCアプリが停止する - 同じコードがコンソールアプリケーションで正常に動作するが、

私は、MVCプロジェクトに同じメソッド/コードを実装し、HomeController内にメソッドを追加してから、ActionResultからメソッドを呼び出し、アクセストークンを取得してから、ViewBagに入れます(テストのためだけに)ビューで表示します。しかし、MVCプロジェクトでは動作しません。

デバッガを実行すると、メソッドでSendAsyncが実行されたときにアプリケーションがハングアップするようです。コンソールには次の出力があります。

アプリケーションInsightsテレメトリ(未構成):{"name": "Microsoft.ApplicationInsights.Dev.RemoteDependency"、 "time": "2017-04-08T09:26:32.4945663Z"タグ ":{" ai.internal.sdkVersion ":" rddf:2.2.0-738 "、" ai.internal.nodeName ":" XXXXXX "、" ai.cloud.roleInstance ":" XXXXXXXX "}、" data " : ""、 "データ": "https://api.vasttrafik.se/token"、 "持続時間":{"baseType": "RemoteDependencyData"、 "baseData":{"ver":2、 "name": "/ token"、 "id": "XXXXXXXXX = : "00:00:00.2810000"、 "resultCode": "200"、 "success":true、 "type": "Http"、 "target": "api.vasttrafik.se"、 "properties":{"DeveloperMode ":" true "}}}} スレッド0x1f68がコード0(0x0)で終了しました。

MVCアプリケーションでAPI呼び出し/応答を行うにはどうすればよいですか? 私の知識は非常に低いです。しかし、私は本当にここで何が起こっているのか理解したい。

ありがとうございます! ベスト J

MVCプロジェクト

public class HomeController : Controller 
    { 

     public ActionResult Index() 
     { 
      string token = PostRequest().Result; 
      ViewBag.Token = token; 

      return View(); 
     } 

     async static Task<string> PostRequest() 
     { 
      var client = new HttpClient(); 
      client.BaseAddress = new Uri("https://api.vasttrafik.se"); 
      var request = new HttpRequestMessage(HttpMethod.Post, "/token"); 
      // Key       // Secret 
      string credentials = "xxxxxxxxxoVS5xDrcO6qZsAp0a" + ":" + "xxxxxxxxhn0STj1w4asDwixdMa"; 
      var plainTextBytes = Encoding.UTF8.GetBytes(credentials); 
      //Key and secret encoded 
      string encodedCrentedials = Convert.ToBase64String(plainTextBytes); 

      //Console.WriteLine(encodedCrentedials); 

      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encodedCrentedials); 

      var formData = new List<KeyValuePair<string, string>>(); 
      formData.Add(new KeyValuePair<string, string>("grant_type", "client_credentials")); 
      formData.Add(new KeyValuePair<string, string>("scope", "xxxxxxxxw0oVS5xDrcO6qZsAp0a")); 

      request.Content = new FormUrlEncodedContent(formData); 
// This is where the app hangs.... 
      var response = await client.SendAsync(request); 
      var mycontentres = await response.Content.ReadAsByteArrayAsync(); 
      var responseBody = Encoding.Default.GetString(mycontentres); 

      //Console.WriteLine(responseBody); 

      JavaScriptSerializer seri = new JavaScriptSerializer(); 

      dynamic data = JObject.Parse(responseBody); 

      string tok = data.access_token; 
      return tok; 
     } 
    } 
+0

I ")は、公共の文字列PostRequest(" ただ、非同期にならない方法を変更することで、これを "解決" 。 これは悪い解決策ですか?この種の行為のためにはasyncはもっと良いでしょうか? – jeth0010

答えて

0

Don't block on async code

public async Task<ActionResult> Index() 
{ 
    string token = await PostRequest(); 
    ViewBag.Token = token; 

    return View(); 
} 
関連する問題