Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用HttpWebResponse时Xamarin Android中未处理的异常_Android_Asynchronous_Xamarin_Httpwebresponse_Webexception - Fatal编程技术网

使用HttpWebResponse时Xamarin Android中未处理的异常

使用HttpWebResponse时Xamarin Android中未处理的异常,android,asynchronous,xamarin,httpwebresponse,webexception,Android,Asynchronous,Xamarin,Httpwebresponse,Webexception,我有以下代码: public async Task<List<RobotViewModel>> GetBot(string token) { var menulist = new List<RobotViewModel>(); try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("mysite/bot/a

我有以下代码:

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;
    }

当承载令牌过期时,catch块抛出一个未处理的异常。当我重新运行程序时,一切正常,因为在上一次应用程序运行时,catch块中生成了新的承载令牌。

代码中有许多问题:

  • ConfigureAwait(false)应仅在类库中使用,因为它会导致当前任务由线程池中的线程而不是主线程处理
  • 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;
    }
    
    公共异步任务GetBot(字符串令牌)
    {
    var menulist=新列表();
    使用(var localClient=new HttpClient())
    {
    尝试
    {
    localClient.MaxResponseContentBufferSize=256000;
    localClient.Timeout=TimeSpan.FromSeconds(40);
    localClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
    localClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,令牌);
    var uri=新uri(“mySite/GetBot”);
    var response=await localClient.GetAsync(uri);
    if(response.StatusCode==HttpStatusCode.OK)
    {
    var encoding=ascienceoding.UTF8;
    使用(var reader=new System.IO.StreamReader(wait response.Content.ReadAsStreamAsync(),编码))
    {
    字符串responseText=reader.ReadToEnd();
    menulist=JsonConvert.DeserializeObject(responseText);
    }
    }
    }
    捕获(例外情况除外)
    {
    掷骰子;
    }
    }
    返回菜单列表;
    }
    
    然后在异步委托中使用它:

        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);
                };
    
            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));
                }
            };
    
    navigationView.NavigationItemSelected+=异步委托
    {
    Shared.Show(这个“请稍候”,-1,AndroidHUD.MaskType.Clear);
    var botList=新列表();
    var cts=新的CancellationTokenSource();
    尝试
    {
    _userRepo=wait new Repository().MakeDatabaseAsync();
    var user=await_userRepo.Table.Where(p=>p.LoggedIn.FirstOrDefaultAsync();
    botList=wait client.GetBot(user.AccessToken);
    如果(botList.Count>0)
    {
    foreach(botList中的var项)
    {
    var bot=await_botRepo.Table.Where(p=>p.Token==item.Token).FirstOrDefaultAsync();
    如果(bot==null)
    wait_botRepo.CreateAsync(新机器人
    {
    名称=项。名称,
    Token=项目。Token,
    TokenUrl=item.TokenUrl,
    UserId=loggedInUser.Id,
    描述=项目。描述
    });
    其他的
    {
    bot.Name=item.Name;
    bot.Token=item.Token;
    bot.TokenUrl=item.TokenUrl;
    bot.UserId=loggedInUser.Id;
    bot.Description=项目描述;
    wait_botRepo.UpdateAsync(bot);
    }
    }
    SetData(botList,out myAdapter);
    expandableListView.SetAdapter(myAdapter);
    AndHUD.Shared.ShowSuccess(这个“Success”,MaskType.Clear,TimeSpan.FromSeconds(2));
    }
    其他的
    {
    _userRepo=wait new Repository().MakeDatabaseAsync();
    user=wait_userRepo.Table.Where(p=>p.LoggedIn).FirstOrDefaultAsync();
    var loginResponse=wait client.Login(user.UserName,user.Password);
    botList=wait client.GetBot(loginResponse.access\u令牌);
    如果(botList.Count>0)
    {
    foreach(botList中的var项)
    {
    var bot=await_botRepo.Table.Where(p=>p.Token==item.Token).FirstOrDefaultAsync();
    如果(bot==null)
    wait_botRepo.CreateAsync(新机器人
    {
    名称=项。名称,
    Token=项目。Token,
    TokenUrl=item.TokenUrl,
    UserId=loggedInUser.Id,
    描述=项目。描述
    });
    其他的
    {
    bot.Name=item.Name;
    bot.Token=item.Token;
    bot.TokenUrl=item.TokenUrl;
    bot.UserId=loggedInUser.Id;
    bot.Description=项目描述;
    wait_botRepo.UpdateAsync(bot);
    }
    }
    SetData(botList,out myAdapter);
    expandableListView.SetAdapter(myAdapter);
    AndHUD.Shared.ShowSuccess(这个“Success”,MaskType.Clear,TimeSpan.FromSeconds(2));
    }
    }
    }
    捕获(例外情况除外)
    {
    如果(ex是AggregateException)
    {
    AndHUD.Shared.bathror(这是“IO错误”,MaskType.Clear,TimeSpan.FromSeconds(2));
    }
    其他的
    AndHUD.Shared.bathror(这个“未知”,MaskType.Clear,TimeSpan.FromSeconds(2));