C# Xamarin Android APK中的HttpClient行为
我有一个Xamarin,安卓APK 当安装在公司本地的平板电脑上时,它可以完美地工作。我已经在大约3个平板电脑中安装了它,它正在按预期工作 问题是,当我将APK发送到我的客户的平板电脑中安装(它位于另一个状态)时,HttpClient似乎没有按预期工作 为了测试它,我展示了一个带有请求响应的C# Xamarin Android APK中的HttpClient行为,c#,xamarin,xamarin.android,httpclient,C#,Xamarin,Xamarin.android,Httpclient,我有一个Xamarin,安卓APK 当安装在公司本地的平板电脑上时,它可以完美地工作。我已经在大约3个平板电脑中安装了它,它正在按预期工作 问题是,当我将APK发送到我的客户的平板电脑中安装(它位于另一个状态)时,HttpClient似乎没有按预期工作 为了测试它,我展示了一个带有请求响应的Toast。它应该返回用户的角色 在本地,它按预期返回角色。在customer中,它返回一个空字符串。本地和服务器中都不会抛出错误 在网上搜索时,我发现这可能与一个问题有关。因此,我在我的Get方法上放置了一
Toast
。它应该返回用户的角色
在本地,它按预期返回角色
。在customer中,它返回一个空字符串。本地和服务器中都不会抛出错误
在网上搜索时,我发现这可能与一个问题有关。因此,我在我的Get
方法上放置了一个.ConfigureAwait(false)
:
public static async Task<string> CheckLoginAsync(string cpf, string password)
{
try
{
_client = new HttpClient();
_client.BaseAddress = new Uri(ApiUrls.Base);
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Vault.CreateToken(cpf));
_client.Timeout = TimeSpan.FromSeconds(Constants.CheckLoginAsyncTimeout);
var url = $"{ApiUrls.UserLoginApp}/{cpf}/{password}";
var result = await _client.GetAsync(url).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
var response = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<string>(response);
}
return null;
}
catch (TaskCanceledException tcex)
{
throw new TaskCanceledException("TaskCanceled", tcex.InnerException);
}
catch (Exception ex)
{
throw new LoginUnsuccessfulException("LoginFailedDB", ex.InnerException);
}
}
我不知道是什么原因导致了这个问题,因为它在本地与相同的APK一起工作,并且在客户中不起作用。客户网络已改为wifi连接,这种行为仍在继续
上面的方法在一个
任务中。Run()
我认为您需要更多的日志记录。回应不仅仅是内容。找出http状态代码、标题等。是否最终在某个地方记录了异常?我只看到你在调用堆栈中抛出它们。虽然你不应该专门使用ConfigureAwait(false)来避免死锁,但如果你无论如何都要这样做,你需要在所有异步调用上都这样做,包括ReadAsStringAsync
。我没有此操作的日志。我将做日志记录,看看是否发现有用的东西。@Crowcoder做日志记录后,我得到一个未经授权的异常。问题是:为什么?apk与本地安装的(公司)相同。但是客户中的apk不起作用。我认为这是VS2017新版本的一个问题。我不知道这是API还是APK的问题。@Crowcoder刚刚发现了问题:令牌。由于某些原因,令牌不正确。我在API上对[Authorize]进行了注释,它成功了。
private async Task<AppBaseData> GetAppBaseDataAsync(string username)
{
try
{
_client = new HttpClient();
_client.BaseAddress = new Uri(ApiUrls.Base);
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Vault.CreateToken(username));
_client.Timeout = TimeSpan.FromSeconds(Constants.LoadBaseDataAsyncTimeout);
var url = $"{ApiUrls.SupportAppBaseData}/{username}";
var result = await _client.GetAsync(url).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
var response = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<AppBaseData>(response);
}
return null;
}
catch (TaskCanceledException ex)
{
throw new TaskCanceledException("TaskCanceled", ex.InnerException);
}
catch (Exception ex)
{
throw new DataNotReadedException("BaseDataDB", ex.InnerException);
}
}