Search code examples
c#xamarin.formsuwprestsharp

Why does RestSharp hang waiting for a response


I recently upgraded RestSharp to version 107.3.0. I had to modify my request some, but the Web API gets the request and returns, but it hangs there waiting for the response...

private async Task<bool> AuthenticateUser(string username, string password)
{
    var encryption = new Encryption64();

    var encrypt = encryption.Encrypt(password, _key);

    var client = new RestClient(UserSettings.URL);

    var uri = $"users/authenticate/{username}/";

    var pass = new PasswordDTO
    {
        Password = encrypt
    };

    var request = new RestRequest(uri)
        .AddJsonBody(pass);

    //var json = JsonConvert.SerializeObject(pass);

    //request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

    var response = await client.PostAsync<bool>(request);

    return response;
}

The line await client.PostAsync<bool>(request) never completes. No errors in the Debug window either. This worked before I upgraded. What am I doing wrong?


Solution

  • I am not sure if this is entirely correct... but I fiddled with it until I got it working.

    private bool AuthenticateUser(string username, string password)
    {    
        using (var client = new RestClient(UserSettings.URL))
        {
            var encryption = new Encryption64();
    
            var encrypt = encryption.Encrypt(password, _key);
    
            var uri = $"users/authenticate/{username}/";
    
            var pass = new PasswordDTO
            {
                Password = encrypt
            };
    
            var request = new RestRequest(uri)
                .AddJsonBody(pass);
    
            var response = client.PostAsync<bool>(request).Result;
    
            return response;
        }
    }
    

    UPDATE

    private async Task<bool> AuthenticateUser(string username, string password)
    {    
        using (var client = new RestClient(UserSettings.URL))
        {
            var encryption = new Encryption64();
    
            var encrypt = encryption.Encrypt(password, _key);
    
            var uri = $"users/authenticate/{username}/";
    
            var pass = new PasswordDTO
            {
                Password = encrypt
            };
    
            var request = new RestRequest(uri)
                .AddJsonBody(pass);
    
            var response = await client.PostAsync<bool>(request);
    
            return response;
        }
    }
    
    public async Task<bool> AuthenticateUserAsync([FromUri] string username, [FromBody] PasswordDTO pass)
    {
        Log.Logger.ForContext<UserController>().Information("{User} is Logging In", username);
        using (var context = new DatabaseContext())
        {
            var user = await context.bma_users
                .AsNoTracking()
                .FirstOrDefaultAsync(p => p.username == username);
    
            if (user is null)
                return false;
    
            return (user.password == pass.Password);
        }
    }
    

    I still welcome any ideas for improvement.