【发布时间】:2018-02-25 08:16:42
【问题描述】:
我正在处理 Xamarin 表单,我需要在整个项目中发送大量 API 请求。我已经创建了一个全局 HTTP 客户端对象并在任何地方使用它。当 Internet 关闭或找不到服务器时,如何处理 HttpRequestException。我正在考虑在一个地方处理这个异常,这样我就不会在数百个地方重复代码。我应该在哪里以及如何做。在我读到的 Xamarin.Forms 中,我们无法全局处理异常。我正在考虑在一个地方处理所有异常并从那里显示一个错误页面。
服务类
public partial class Service
{
private string BaseUrl { get; set; }
private string AccessToken { get; set; }
private static HttpClient Client = new HttpClient();
public Service()
{
}
public Service(string BaseUrl)
{
this.BaseUrl = BaseUrl;
}
public Service(string BaseUrl, string AccessToken)
{
this.BaseUrl = BaseUrl;
this.AccessToken = AccessToken;
}
}
}
Api消费方式之一
public async Task<bool> ExternalLogin(string email)
{
bool UserAlreadyRegistered = false;
bool IsUserRegistered = true;
var request = new HttpRequestMessage()
{
RequestUri = new Uri(this.BaseUrl + "api/Account/UserInfo"),
Method = HttpMethod.Get,
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
var UserInfo = await Client.SendAsync(request);
if (UserInfo.IsSuccessStatusCode)
{
var response = await UserInfo.Content.ReadAsStringAsync();
var authenticationTicket = JsonConvert.DeserializeObject<dynamic>(response);
if (authenticationTicket.Value<bool>("HasRegistered"))
{
UserAlreadyRegistered = true;
}
}
if (!UserAlreadyRegistered)
{
request = new HttpRequestMessage()
{
RequestUri = new Uri(this.BaseUrl + "api/Account/RegisterExternal"),
Method = HttpMethod.Post,
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
var content = new FormUrlEncodedContent(new[] {
new KeyValuePair<string, string> ("Email", email)
});
request.Content = content;
var authenticateResponse = await Client.SendAsync(request);
if (!authenticateResponse.IsSuccessStatusCode)
{
IsUserRegistered = false;
}
}
return IsUserRegistered;
}
EvZ Ans 后更新
调用扩展方法:
string result = await Task.Run(() => new Service(Settings.BaseUrl, Settings.AccessToken).Register(Model)).ExecuteAsyncOperation();
扩展方法:
public static class TaskExtensions
{
public static async Task<T> ExecuteAsyncOperation<T>(this Task<T> operation)
{
try
{
return await operation;
}
catch
{
return default(T);
}
}
}
【问题讨论】:
标签: c# xamarin exception-handling xamarin.forms httpclient