使用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块中生成了新的承载令牌。代码中有许多问题:
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));