Xamarin中的HTTP调用将应用程序发送到后台时,iOS应用程序崩溃

问题描述 投票:0回答:1

我正在使用C#HttpClient在Xamarin.iOS应用程序中发送HTTP调用。但是,当我将应用程序发送到后台或什至在发送呼叫时,我打开控制中心或通知中心时,我的应用程序崩溃会导致OperationCanceledException。每当我从服务器获得响应时,就将委托用作这些调用中的回调。有什么办法可以阻止我的应用崩溃。这是我的代码的以下示例。

    public async void LoginVerify(APIDelegate<Response<bool>> callback)
    {
        try
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(IP);
                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("login_code", Login_Code),
                });
                CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromSeconds(TimeOutTime));
                var result = await client.PostAsync("/dev", content, cts.Token);
                string resultContent = await result.Content.ReadAsStringAsync();


                Response<bool> response = JsonConvert.DeserializeObject<Response<bool>>(resultContent);
                callback(response);
            }
        }
        catch (OperationCanceledException ex)
        {
            callback(new Response<bool> { ErrorMsg = Params.NoInternet_error, Message = Params.NoInternet_error, Data = false, StatusCode = int.Parse(Params.NoInternet_code) });
        }
        catch (JsonSerializationException ex)
        {
            callback(new Response<bool> { ErrorMsg = Params.Main_error, Message = Params.JsonDeserialize_error + " in LoginVerify Function", Data = false, StatusCode = int.Parse(Params.JsonDeserialize_error_code) });
        }
        catch (Exception ex)
        {
            callback(new Response<bool> { ErrorMsg = Params.Main_error, Message = ex.Message + " :: " + ex.StackTrace +" in LoginVerify Function", Data = false, StatusCode = int.Parse(Params.AppInternalIssue_code) });
        }
    }

收到回复后,我像这样使用我的代表:

        void Login(string ntlogin)
        {
            try
            {
                if (!CheckInternetConnection())
                {
                    NoInternetError();
                }
                else
                {
                    if (toast != null)
                        toast.Dismiss();
                    API.Login_Code = code_first.Text + code_second.Text + code_third.Text + code_fourth.Text;

                    API.LoginVerify((responseVerify) =>
                    {
                        if (responseVerify != null)
                        {
                            if (responseVerify.StatusCode == 200)
                            {
                                if (responseVerify.Data)
                                {
                                    API.Data((response) =>
                                    {
                                        _timer.Stop();
                                    //If No Exception Is Thrown
                                        if (response != null)
                                        {
                                            if (response.StatusCode == 200 || response.StatusCode == 202)
                                            {
                                                tab. = response.Data;

                                                //del.Window.RootViewController = nav;
                                                UIView.Transition(del.Window, 0.5, UIViewAnimationOptions.TransitionFlipFromRight, () =>
                                                {
                                                    del.Window.RootViewController = tab;
                                                }, null);

                                            }
                                            else
                                            {
                                                ErrorLog(response.Message, response.Message + " Error while fetching  details on SplashController.", Params.AppInternalIssue_code);
                                            }
                                        }
                                        else
                                        {
                                            ErrorLog(Params.Main_error, "  Details returned null on Splash Controller.", Params.AppInternalIssue_code);
                                        }

                                    });
                                }
                            }
                        }
                        else
                        {
                            loadPop.Hide();
                            ErrorLog(Params.Main_error, responseVerify.Message, Params.AppInternalIssue_code);
                        }
                    });
                }

            }
            catch (Exception ex)
            {
                ErrorLog(Params.Main_error, ex.Message + " :: " +  ex.StackTrace + " :: LoginSMSController func Login", Params.AppInternalIssue_code);
            }
        }
c# xamarin xamarin.ios httpclient
1个回答
0
投票

这是正在引发的异常。

System.Threading.Tasks.TaskCanceledException: A task was canceled.
      at System.Net.Http.NSUrlSessionHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x001d4] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.16.0.13/src/Xamarin.iOS/Foundation/NSUrlSessionHandler.cs:462 
      at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:506 
      at API.Entities.Support.SupportAPI.SupportData (API.Entities.Support.SupportAPI+SupportAPIDelegate`1[T] callback) [0x001ab] in /Users/zshakil/Desktop/Projects/Support/API/Entities/SupportAPI.cs:271 }

行号的屏幕截图:271enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.