2016-09-09 12 views
4

.NET Core ASP.NET MVC 6アプリケーションがあり、Visual Studioのバグがあると確信しています。私がawait文の後にブレークポイントを置くと、オブジェクトはローカルには現れず、マウスを使って検査することはできません。しかし、私が変数を使用しても、それでも正常に動作し、確実に実装されます。このような単純なVisual Studio 2015の非同期変数がデバッガに表示されない

何か:

public async Task<IActionResult> Index() 
    { 
     var location = await _listingLocationService.GetLocationByAddress("123 Fake Street"); 
     return Content(location.Latitude.ToString() + " " +location.Longitude.ToString()); 
    } 

私はreturn文にブレークポイントを配置した場合、私は場所を検査することはできません。それはどこにも現れません。私はまだ待つことを取り除くことができます&場所。最後には結果、まだ何も表示されません。しかし、私が続行すると、ビューにはlocation.latitudeとlocation.longitudeが表示されます。だから私はそれが人口になっていることを知っています。

GetLocationByAddress関数も同様に扱いますが、同じことをしています。待ってからブレークポイントを置くと、変数を検査できません(デシリアライズされたリストさえも!)。 。

public async Task<Geolocation> GetLocationByAddress(string address) 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri("https://maps.googleapis.com/maps/api/geocode/json"); 
       var request = new HttpRequestMessage(HttpMethod.Get, "?address=" + WebUtility.UrlEncode(address) + "&key=..."); 
       var response = await client.SendAsync(request); 
       var contents = await response.Content.ReadAsStringAsync(); 
       var locationResult = JsonConvert.DeserializeObject<GoogleLocationResult>(contents); 
       if (locationResult.status == "OK") 
       { 
        var result = locationResult.results.First().geometry.location; 
        return new Geolocation 
        { 
         Latitude = result.lat, 
         Longitude = result.lng 
        }; 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 
+0

こんにちはadam3039、これに対する解決方法を見つけましたか?それとも少なくともそれが原因ですか? – Vi100

答えて

5

この問題で一日を終わらせた後、私はついに問題の原因と解決策を見つけました... 私の場合、問題はプロジェクトを.netコア1.1ここに示す手順に従ってプレビュー1:Link to MSFT .NET Blog

問題がproject.jsonファイル内のコード行によって引き起こされた:

"buildOptions": { 
    "debugType": "portable", <---- THIS 
    "preserveCompilationContext": true, 
    "emitEntryPoint": true 
} 

「フル」に「DEBUGTYPE」を設定した後、待望の変数はに開始デバッグ中に再び表示されます。

誰かに助けてくれることを願っています!

-2

これはバグではありません。デバッガが戻り行にヒットしたときは、直前の行がすぐにTaskオブジェクトを返したためです。あなたのGetLocationメソッドはまだ実行されていません(タスクを返すまでに要するミリ秒よりも長くかかるアウトバウンドHTTP呼び出しを行っているので意味があります)。リターンラインに達すると、デバッガはそこで停止しましたが、不完全なタスクはその場所が準備できないことを意味します。おそらく、GetLocationメソッドの戻り行にブレークポイントを配置する場所があります。

Google Mapsへの呼び出しに失敗した場合は、アクションメソッドでnull refエラーが発生します。

+0

get locationメソッドの戻り行を含め、コード全体にブレークポイントを設定しましたが、変数は検査に使用できません。私はこれをMVC 5で何百回もやったことがあるので、私はバグを経験していると思っています。私はasync/await、なぜ使用されるまで評価されないのかを理解しています。 – adam3039

+1

Jeff、あなたは間違っています...前の行は、 "待たれている"ので、変数で非同期呼び出しの結果を取得する必要がありますので、タスクオブジェクトを返しません...私は説明された不規則な動作が発生しています今の質問では、突然。私の非同期呼び出しは、EFコアの意味でデータベースに対して行われます。それはバグのようです... – Vi100

関連する問題