2016-07-11 13 views
1

外部サービスへの非同期呼び出しでGlobal.asax.csのsession_startでASP MVCコードをリファクタリングしています。私は、IEで無限回転の白いページを取得するか、実行がすぐに呼び出しスレッドに戻ります。 Session_start()で.Resultを試してみたとき、回転するIEアイコン付きの白いページが表示されました。 .ContinueWith()を試してみると、実行は非同期の結果に依存する次の行に戻ります。したがって、authResultは常にnullです。助けてもらえますか?ありがとう。async getting no where

これは、これはこれはHttpClientを

を使用して実際の呼び出しを行うヘルパークラスであるUser_Controllerクラスから

public async Task <AuthResult> checkUserViaWebApi(string networkName) { 
     UserProfile _thisProfile = await VhaHelpersLib.WebApiBroker.Get <UserProfile> (
     System.Configuration.ConfigurationManager.AppSettings["userWebApiEndpoint"], "User/Profile/" + networkName); 


     AuthResult authenticationResult = new AuthResult(); 

     if (_thisProfile == null) /*no user profile*/ { 
     authenticationResult.Result = enumAuthenticationResult.NoLSV; 
     authenticationResult.Controller = "AccessRequest"; 
     authenticationResult.Action = "LSVInstruction"; 
     } 

でのsession_start()

  if (Session["userProfile"] == null) { 
      //call into an async method 
      //authResult = uc.checkUserViaWebApi(networkLogin[userLoginIdx]).Result; 
      var userProfileTask = uc.checkUserViaWebApi(networkLogin[userLoginIdx]) 
      .ContinueWith(result => { 
       if (result.IsCompleted) { 
       authResult = result.Result; 
       } 
      }); 

      Task.WhenAll(userProfileTask); 

      if (authResult.Result == enumAuthenticationResult.Authorized) { 

からです

public static async Task<T> Get<T>(string baseUrl, string urlSegment) { string content = string.Empty; using(HttpClient client = GetClient(baseUrl)) { HttpResponseMessage response = await client.GetAsync(urlSegment.TrimStart('/')).ConfigureAwait(false); if(response.IsSuccessStatusCode) { content = await response.Content.ReadAsStringAsync(); } return JsonConvert.DeserializeObject<T>(content); } 
+0

あなたはこの質問を見てみたいことがあります。http://stackoverflow.com/questions/15167243/session-issue-when-having-async-session-start-method –

+0

は、私はそれをしようとしたが、それはしませんでした働いた。 – user266909

+0

asyncを使用している唯一の理由は、 'HttpClient'を使用しているためです。useは' 'WebClient.DownloadString'を使用できます(https://msdn.microsoft.com/en-us/library/fhd1f0sw(v = vs.110).aspx)でなく、非同期ではありません。 –

答えて

0

UserControllerをSession_Startから呼び出しても意味がありません。

VhaHelpersLibに依存関係がない場合は、Session_Startに直接VhaHelpersLibを呼び出します。

Session_Startが非同期でないため、結果を使用します。

var setting = ConfigurationManager.AppSettings["userWebApiEndpoint"]; 
UserProfile profile = await VhaHelpersLib.WebApiBroker.Get<UserProfile>(
     setting, "User/Profile/" + networkName).Result; 

if (profile == enumAuthenticationResult.Authorized) { 
    ... 
} 
+0

user_controllerには、承認レベルを決定するビジネスロジックがあります。コードスニペットは、ロジックのごく一部を示しています。これはsession_start()の問題ではありません。さらに、session_start()が非同期に変更されるためのシグネチャが必要であるため、コンパイルできないことをお勧めします。 – user266909

+0

最後に**結果**を使用しましたか?基本的に、Resultはタスクが完了するまでブロックされます。たとえば、元の質問では、 'var userProfileTask = uc.checkUserViaWebApi(networkLogin [userLoginIdx])。Result;' – Win

+0

ありがとうございます。それはうまくいって、私はかなりのビジネスロジックをuser_controllerクラスに残しました。 – user266909