Reputation: 8338
I am trying to access my url using GetStringAsync method but the call hangs and never ends. When I check it in browser it works perfect but somehow in my code it never ends. My code:
public bool Login(string url,string userName, string password)
{
try
{
Task<LoginResponse> response = GetLoginData(url, userName, password);
if(response.Result.UserInfo.UserId > 0){
IsAuthenticated = true;
}
return IsAuthenticated;
}
catch (ArgumentException argex)
{
ErrorMessage = argex.Message;
IsAuthenticated = false;
return IsAuthenticated;
}
}
public async Task<LoginResponse> GetLoginData(string url, string userName, string password)
{
try{
var param = new AuthenticationParam();
param.UserName = userName;
param.Password = password;
var response = await LoginValidate(url, param);
response = response.Replace("\"", string.Empty);
response = response.Replace("\\", "\"");
LoginResponse list = JsonConvert.DeserializeObject<LoginResponse>(
response, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
return list;
}
catch(Exception e){
System.Diagnostics.Debug.WriteLine(e);
return new LoginResponse();
}
}
private static async Task<string> LoginValidate(string url, AuthenticationParam param){
try
{
string result = "";
using (var client = new HttpClient())
{
var json_data = string.Empty;
json_data = JsonConvert.SerializeObject(param);
var byteArray = Encoding.UTF8.GetBytes(json_data);
var base64 = Convert.ToBase64String(byteArray);
url = $"{url}{base64}";
result = await client.GetStringAsync(url);
return result;
}
}
catch (Exception ex)
{
return "Error: " + ex.Message;
}
}
It hangs at line result = await client.GetStringAsync(url);
Upvotes: 2
Views: 684
Reputation: 29730
if(response.Result.UserInfo.UserId > 0){
-> .Result is a blocking call and can lead to deadlocks. Use await all the way up the call chain.
public async Task<bool> Login(string url,string userName, string password)
{
try
{
var response = await GetLoginData(url, userName, password);
if(response.UserInfo.UserId > 0){
IsAuthenticated = true;
}
return IsAuthenticated;
}
catch (ArgumentException argex)
{
ErrorMessage = argex.Message;
IsAuthenticated = false;
return IsAuthenticated;
}
}
Up in the call stack use var success = await Login(...);
And please, read this excellent blogpost for the background about how this deadlock is created.
Upvotes: 7