Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin Android APK中的HttpClient行为_C#_Xamarin_Xamarin.android_Httpclient - Fatal编程技术网

C# Xamarin Android 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方法上放置了一

我有一个Xamarin,安卓APK

当安装在公司本地的平板电脑上时,它可以完美地工作。我已经在大约3个平板电脑中安装了它,它正在按预期工作

问题是,当我将APK发送到我的客户的平板电脑中安装(它位于另一个状态)时,HttpClient似乎没有按预期工作

为了测试它,我展示了一个带有请求响应的
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);
    }
}