1

を使用すると、私は次のコードを持っている:未処理の例外HttpWebResponseの

public async Task<List<RobotViewModel>> GetBot(string token) 
    { 
     var menulist = new List<RobotViewModel>(); 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("mysite/bot/abc/process/GetBot"); 
      request.Accept = "application/json"; 
      request.Method = "GET"; 
      request.Headers["Authorization"] = "Bearer " + token; 
      var response = (HttpWebResponse)await request.GetResponseAsync().ConfigureAwait(false); 
      if(response.StatusCode==HttpStatusCode.OK) 
      { 
       var encoding = ASCIIEncoding.UTF8; 
       using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding)) 
       { 
        string responseText = reader.ReadToEnd(); 
        menulist = JsonConvert.DeserializeObject<List<RobotViewModel>>(responseText); 
       } 
      } 
     } 
     catch(System.Net.WebException exc) 
     { 
      var response = (HttpWebResponse)exc.Response; 
      switch(response.StatusCode) 
      { 
       case HttpStatusCode.InternalServerError: 
        { 
         _userRepo = await new Repository<User>().MakeDatabaseAsync(); 
         var user = await _userRepo.Table.Where(p => p.LoggedIn).FirstOrDefaultAsync(); 
         await Login(user.UserName, user.Password); 
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create("mysite/bot/abc/process/GetBot"); 
         request.Accept = "application/json"; 
         request.Method = "GET"; 
         request.Headers["Authorization"] = "Bearer " + user.AccessToken; 
         response = (HttpWebResponse)await request.GetResponseAsync().ConfigureAwait(false); 
         if (response.StatusCode == HttpStatusCode.OK) 
         { 
          var encoding = ASCIIEncoding.UTF8; 
          using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding)) 
          { 
           string responseText = reader.ReadToEnd(); 
           menulist = JsonConvert.DeserializeObject<List<RobotViewModel>>(responseText); 

          } 
         } 
         break; 
        } 
       default: 
        throw; 
      } 
     } 
     catch(Exception exc) 
     { 

     } 

     return menulist; 
    } 

このコードは、次のデリゲートに使用されている:ベアラートークンの有効期限が切れている場合は

navigationView.NavigationItemSelected += async delegate 
      { 

       AndHUD.Shared.Show(this, "Please Wait", -1, AndroidHUD.MaskType.Clear); 


       var botList = await client.GetBot(loggedInUser.AccessToken); 
       if (botList.Count > 0) 
       { 
        var botListMemory = await _botRepo.GetAllAsync(); 

        foreach (var item in botList) 
        { 
         var bot =await _botRepo.Table.Where(p => p.Token == item.Token).FirstOrDefaultAsync(); 
         if(bot==null) 
         await _botRepo.CreateAsync(new Robot 
         { 
          Name = item.Name, 
          Token = item.Token, 
          TokenUrl = item.TokenUrl, 
          UserId = loggedInUser.Id, 
          Description = item.Description 
         }); 
         else 
         { 
          bot.Name = item.Name; 
          bot.Token = item.Token; 
          bot.TokenUrl = item.TokenUrl; 
          bot.UserId = loggedInUser.Id; 
          bot.Description = item.Description; 
          await _botRepo.UpdateAsync(bot); 
         } 
        } 

        AndHUD.Shared.ShowSuccess(this, "Success", MaskType.Clear, TimeSpan.FromSeconds(2)); 
       } 
       else 
        AndHUD.Shared.ShowError(this, "Server Error", MaskType.Clear, TimeSpan.FromSeconds(2)); 

       SetData(botList, out myAdapter); 
       expandableListView.SetAdapter(myAdapter); 
      }; 

catchブロックは、スロー未処理の例外。プログラムを再実行すると、以前のアプリケーションの実行時に新しいBearerトークンがcatchブロックで生成されたため、すべて正常に動作します。

+0

どのような例外がスローされますか? catchブロックにコードがあると、例外がスローされることがあります。 –

+0

このコード行の後:response =(HttpWebResponse)await request.GetResponseAsync()。ConfigureAwait(false); –

+0

ええ、例外タイプは何ですか? –

答えて

1

コードで多くの問題がありました。それは現在のタスクは、スレッドプールからのスレッドではないメインスレッドによって処理されるようにするため

  1. ConfigureAwait(偽)は、単にクラスライブラリで使用する必要があります...
  2. httpClientはブロックを使用してそれを処分するためにブロックを使用する必要があります。 だから私は、次のようにGetBot方法を変更:

    public async Task<List<RobotViewModel>> GetBot(string token) 
    { 
        var menulist = new List<RobotViewModel>(); 
        using (var localClient = new HttpClient()) 
        { 
         try 
         { 
          localClient.MaxResponseContentBufferSize = 256000; 
          localClient.Timeout = TimeSpan.FromSeconds(40); 
          localClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
          localClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
          var uri = new Uri("mySite/GetBot"); 
          var response = await localClient.GetAsync(uri); 
          if (response.StatusCode == HttpStatusCode.OK) 
          { 
           var encoding = ASCIIEncoding.UTF8; 
           using (var reader = new System.IO.StreamReader(await response.Content.ReadAsStreamAsync(), encoding)) 
           { 
            string responseText = reader.ReadToEnd(); 
            menulist = JsonConvert.DeserializeObject<List<RobotViewModel>>(responseText); 
           } 
          } 
         } 
         catch (Exception ex) 
         { 
          throw ex; 
         } 
        } 
        return menulist; 
    } 
    

    、その後、非同期デリゲートでそれを使用:

     navigationView.NavigationItemSelected += async delegate 
         { 
          AndHUD.Shared.Show(this, "Please Wait", -1, AndroidHUD.MaskType.Clear); 
    
          var botList = new List<RobotViewModel>(); 
          var cts = new CancellationTokenSource(); 
    
          try 
          { 
           _userRepo = await new Repository<User>().MakeDatabaseAsync(); 
           var user = await _userRepo.Table.Where(p => p.LoggedIn).FirstOrDefaultAsync(); 
           botList = await client.GetBot(user.AccessToken); 
           if (botList.Count > 0) 
           { 
            foreach (var item in botList) 
            { 
             var bot = await _botRepo.Table.Where(p => p.Token == item.Token).FirstOrDefaultAsync(); 
             if (bot == null) 
              await _botRepo.CreateAsync(new Robot 
              { 
               Name = item.Name, 
               Token = item.Token, 
               TokenUrl = item.TokenUrl, 
               UserId = loggedInUser.Id, 
               Description = item.Description 
              }); 
             else 
             { 
              bot.Name = item.Name; 
              bot.Token = item.Token; 
              bot.TokenUrl = item.TokenUrl; 
              bot.UserId = loggedInUser.Id; 
              bot.Description = item.Description; 
              await _botRepo.UpdateAsync(bot); 
             } 
            } 
            SetData(botList, out myAdapter); 
            expandableListView.SetAdapter(myAdapter); 
            AndHUD.Shared.ShowSuccess(this, "Success", MaskType.Clear, TimeSpan.FromSeconds(2)); 
           } 
           else 
           { 
            _userRepo = await new Repository<User>().MakeDatabaseAsync(); 
            user = await _userRepo.Table.Where(p => p.LoggedIn).FirstOrDefaultAsync(); 
            var loginResponse = await client.Login(user.UserName, user.Password); 
            botList = await client.GetBot(loginResponse.access_token); 
            if (botList.Count > 0) 
            { 
             foreach (var item in botList) 
             { 
              var bot = await _botRepo.Table.Where(p => p.Token == item.Token).FirstOrDefaultAsync(); 
              if (bot == null) 
               await _botRepo.CreateAsync(new Robot 
               { 
                Name = item.Name, 
                Token = item.Token, 
                TokenUrl = item.TokenUrl, 
                UserId = loggedInUser.Id, 
                Description = item.Description 
               }); 
              else 
              { 
               bot.Name = item.Name; 
               bot.Token = item.Token; 
               bot.TokenUrl = item.TokenUrl; 
               bot.UserId = loggedInUser.Id; 
               bot.Description = item.Description; 
               await _botRepo.UpdateAsync(bot); 
              } 
             } 
             SetData(botList, out myAdapter); 
             expandableListView.SetAdapter(myAdapter); 
             AndHUD.Shared.ShowSuccess(this, "Success", MaskType.Clear, TimeSpan.FromSeconds(2)); 
            } 
           } 
          } 
          catch (Exception ex) 
          { 
           if (ex is AggregateException) 
           { 
            AndHUD.Shared.ShowError(this, "IO Error", MaskType.Clear, TimeSpan.FromSeconds(2)); 
           } 
           else 
            AndHUD.Shared.ShowError(this, "Unknown", MaskType.Clear, TimeSpan.FromSeconds(2)); 
          } 
         }; 
    

    今、すべてのものは、罰金作品!御時間ありがとうございます!