当我尝试将Json与HttpClient一起使用时,应用程序进入休眠模式

时间:2017-11-22 15:45:01

标签: c# json xamarin httpclient

我正在尝试将我的应用程序中的数据从注册页面发布到Web服务(使用requestb.in进行测试)但是当我尝试使用下面的代码时,它会将应用程序置于中断模式,然后当我使用断点时找到问题所在,只是表明“等待PostRequest(...)”导致问题。 我在Portable项目和android项目上都安装了System.Net.Http。

public async Task<JObject> PostAsync(string uri, string data)
{
    var httpClient = new HttpClient();
    var response = await httpClient.PostAsync(uri, new StringContent(data));

    response.EnsureSuccessStatusCode();

    string content = await response.Content.ReadAsStringAsync();
    return await Task.Run(() => JObject.Parse(content));
}

然后单击按钮调用此方法的位置:

async void NextBtnClicked(object sender, EventArgs)
{
   await PostAsync("https://requestb.in/MYURL", Username.Text);
}

Username.Text是XAML类中输入字段的字符串,这将重新创建我的问题

2 个答案:

答案 0 :(得分:1)

以下是我将数据发布到API的通用方法。

正如上面@maccettura指出的那样,best practice to reuse HttpClient已经包含在下面的代码中。

HttpClient Post

static readonly Lazy<HttpClient> _clientHolder = new Lazy<HttpClient>(() => CreateHttpClient(TimeSpan.FromSeconds(60)));
static HttpClient Client => _clientHolder.Value;

protected static async Task<HttpResponseMessage> PostObjectToAPI<T>(string apiUrl, T data)
{
    var stringPayload = await Task.Run(() => JsonConvert.SerializeObject(data)).ConfigureAwait(false);
    var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

    try
    {
        return await Client.PostAsync(apiUrl, httpContent).ConfigureAwait(false);
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
        return null;
    }
}

static HttpClient CreateHttpClient(TimeSpan timeout)
{
    var client = new HttpClient();

    client.Timeout = timeout;
    client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));

    return client;
}

此代码段取自我BaseHttpClientService.cs,我将其复制/粘贴到任何需要使用HttpClient的应用中: https://github.com/brminnick/XamList/blob/master/XamList/Services/BaseHttpClientService.cs

答案 1 :(得分:0)

使用UWP对您的应用程序进行故障排除,以便您可以查看它所引发的异常类型。还要尝试降级两个Nuget包。