C# 处理xamarin表单中api请求的一处异常

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

我正在处理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;

        }

    }
}
原料药消费方法之一

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();