C# 处理xamarin表单中api请求的一处异常
我正在处理Xamarin表单,我需要在整个项目中发送大量API请求。我制作了一个全局HTTP客户机对象,并在任何地方使用它。当Internet关闭或找不到服务器时,如何处理HttpRequestException。我正在考虑在一个地方处理这个异常,这样我就不会在数百个地方重复代码。我应该在哪里做,怎样做。在我读到的Xamarin.Forms中,我们不能全局处理异常。我正在考虑在一个地方处理所有异常,然后显示一个错误页面 服务等级C# 处理xamarin表单中api请求的一处异常,c#,xamarin,exception-handling,xamarin.forms,httpclient,C#,Xamarin,Exception Handling,Xamarin.forms,Httpclient,我正在处理Xamarin表单,我需要在整个项目中发送大量API请求。我制作了一个全局HTTP客户机对象,并在任何地方使用它。当Internet关闭或找不到服务器时,如何处理HttpRequestException。我正在考虑在一个地方处理这个异常,这样我就不会在数百个地方重复代码。我应该在哪里做,怎样做。在我读到的Xamarin.Forms中,我们不能全局处理异常。我正在考虑在一个地方处理所有异常,然后显示一个错误页面 服务等级 public partial class Service
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;
}
}
}
原料药消费方法之一
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;
}
扩展方法:
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);
}
}
}
公共静态类任务扩展
{
公共静态异步任务执行同步(此任务操作)
{
尝试
{
返回等待操作;
}
抓住
{
返回默认值(T);
}
}
}
扩展您的服务以获得下一种方法(根据您的需要):
注:请注意,服务
是一个非常糟糕的命名。完全不清楚服务
类负责什么。另外,您也可以为
任务创建一个扩展方法,以包装所有api请求,并使用一个try/catch。
简单示例:
public static class TaskExtensions
{
public static async Task<T> ExecuteAsyncOperation<T>(this Task<T> operation)
{
try
{
return await operation;
}
catch{ }
}
}
var token = await apiService.Authenticate(string username, string password).ExecuteAsyncOperation();
公共静态类任务扩展
{
公共静态异步任务执行同步(此任务操作)
{
尝试
{
返回等待操作;
}
捕获{}
}
}
var token=wait apiService.Authenticate(字符串用户名、字符串密码)。ExecuteAsyncOperation();
扩展您的服务以获得下一种方法(根据您的需要):
注:请注意,服务
是一个非常糟糕的命名。完全不清楚服务
类负责什么。
另外,您也可以为任务创建一个扩展方法,以包装所有api请求,并使用一个try/catch。
简单示例:
public static class TaskExtensions
{
public static async Task<T> ExecuteAsyncOperation<T>(this Task<T> operation)
{
try
{
return await operation;
}
catch{ }
}
}
var token = await apiService.Authenticate(string username, string password).ExecuteAsyncOperation();
公共静态类任务扩展
{
公共静态异步任务执行同步(此任务操作)
{
尝试
{
返回等待操作;
}
捕获{}
}
}
var token=wait apiService.Authenticate(字符串用户名、字符串密码)。ExecuteAsyncOperation();
哪种方法最好?你说的扩展方法有什么例子吗?最好的方法是最适合你的方法。用一个例子更新了我的答案。请看我所做的编辑。这是正确的方法吗?哪种方法最好?你说的扩展方法有什么例子吗?最好的方法是最适合你的方法。用一个例子更新了我的答案。请看我所做的编辑。这是正确的方法吗?
public static class TaskExtensions
{
public static async Task<T> ExecuteAsyncOperation<T>(this Task<T> operation)
{
try
{
return await operation;
}
catch{ }
}
}
var token = await apiService.Authenticate(string username, string password).ExecuteAsyncOperation();