TaskCanceledException on Refit call

1k views Asked by At

I am implementing a simple login screen with MvvmCross Forms and Refit.

The start of the authentication task is started by pressing the button that has the command 'LogInCommand'

<Button x:Name="loginButton" Text = "Login"  HorizontalOptions = "Center"
    VerticalOptions = "StartAndExpand" FontSize="24" Command="{ Binding LogInCommand }"/>

This will execute the following command in the AuthenticationViewModel:

#region commands

        async Task LogInTaskAsync()
        {

            var errors = _validator.Validate(this);
            if (!errors.IsValid)
            {
                _toastService.DisplayErrors(errors); //Display errors here.

            }
            else
            {

                using (new Busy(this))
                {

                    try
                    {
                        Status = AuthenticationStatusEnum.LOADING;
                        // get access token
                        string accessToken = await _authenticationService.LogIn(_email, _password);

                        Debug.WriteLine(String.Format("Access Token:t {0} ", accessToken));

                        // save token on preferences.
                        Settings.AccessToken = accessToken;

                        Status = AuthenticationStatusEnum.LOGIN_SUCESS;

                    }
                    catch (TaskCanceledException ex) {
                        Debug.WriteLine("Timeout Operation ...");

                    }
                    catch (Exception ex)
                    {

                        MessagingCenter.Send(new object(), EventTypeName.EXCEPTION_OCCURRED, ex);
                        Status = AuthenticationStatusEnum.LOGIN_FAILED;
                    }

                }
            }
        }


        IMvxCommand _logInCommand;
        public IMvxCommand LogInCommand =>
            _logInCommand ?? (_logInCommand = new MvxCommand(async () => await LogInTaskAsync()));

An instance of the AuthenticationService that is working with refit is injected into the view model.

async public Task<string> LogIn(string email, string password)
        {
            Debug.WriteLine(String.Format("Login with {0}/{1}", email, password));

            return await _authenticationRestService.getAuthorizationToken(new JwtAuthenticationRequestDTO()
            {
                Email = email,
                Password = password
            }).ContinueWith(t => t.Result.Data.Token, TaskContinuationOptions.OnlyOnRanToCompletion);
        }

The Refit service specification is as follows:

[Headers("Accept: application/json")]
    public interface IAuthenticationRestService
    {

        [Post("/")]
        Task<APIResponse<JwtAuthenticationResponseDTO>> getAuthorizationToken([Body] JwtAuthenticationRequestDTO authorizationRequest);

    }

The problem is that the task is always canceled, the TaskCanceledException exception is always thrown.

error trace

I also expose CoreApp where I configure context instances.

public class CoreApp : MvvmCross.Core.ViewModels.MvxApplication
    {

        public override void Initialize()
        {

            var httpClient = new HttpClient(new HttpLoggingHandler())
            {
                BaseAddress = new Uri(SharedConfig.BASE_API_URL),
                Timeout = TimeSpan.FromMinutes(SharedConfig.TIMEOUT_OPERATION_MINUTES)
            };


            // Register REST services
            Mvx.RegisterSingleton<IAuthenticationRestService>(() => RestServiceFactory.getService<IAuthenticationRestService>(httpClient));
            Mvx.RegisterSingleton<IParentsRestService>(() => RestServiceFactory.getService<IParentsRestService>(httpClient));
            Mvx.RegisterSingleton<IChildrenRestService>(() => RestServiceFactory.getService<IChildrenRestService>(httpClient));

            CreatableTypes()
                .InNamespace("Bullytect.Core.Services")
                .EndingWith("ServiceImpl")
                .AsInterfaces()
                .RegisterAsLazySingleton();


            Mapper.Initialize(cfg => {
                cfg.CreateMap<ParentDTO, ParentEntity>();
                cfg.CreateMap<SonDTO, SonEntity>();
            });

            Mvx.RegisterType<IValidator, Validator>();

            RegisterAppStart(new CustomAppStart());

        }


    }

Someone knows how I can fix this. Thanks in advance!!

0

There are 0 answers