【问题标题】:How to return the Task<T> from HttpResponseMessage.Content.ReadAsStringAsync().ContinueWith() method?如何从 HttpResponseMessage.Content.ReadAsStringAsync().ContinueWith() 方法返回 Task<T>?
【发布时间】:2015-03-21 13:39:39
【问题描述】:

我正在尝试使用 HttpClient 类获取/发布并面临以下问题

  1. 不知道如何从 HttpResponseMessage.Content.ReadAsStringAsync().ContinueWith() 方法返回任务。
  2. 由于某种原因,它一直在自动取消

        private static Task<T> HttpClientSendAsync<T>(string url, object data, HttpMethod method, string contentType, CancellationToken token)
    {
        HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url);
        RetryDelegatingHandler retryDelegatingHandler = new RetryDelegatingHandler();
        retryDelegatingHandler.PreAuthenticate = true;
        retryDelegatingHandler.Credentials = Credential;
        retryDelegatingHandler.Proxy = null;
    
        HttpClient httpClient = new HttpClient(retryDelegatingHandler);
        httpClient.Timeout = new TimeSpan(Constants.TimeOut);
    
        if (data != null)
        {
            byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data));
            MemoryStream memoryStream = new MemoryStream(byteArray);
            httpRequestMessage.Content = new StringContent(new StreamReader(memoryStream).ReadToEnd(), Encoding.UTF8, contentType);
        }
    
        Task<HttpResponseMessage> httpResponseMessage = httpClient.SendAsync(httpRequestMessage);
        httpResponseMessage.ContinueWith((task) =>
            {
                if (!task.IsFaulted)
                {
                    HttpResponseMessage response = task.Result;
                    response.Content.ReadAsStringAsync().ContinueWith(
                    (stringTask) =>
                    {
                        if (!stringTask.IsFaulted)
                        {
                            return Helper.FromJSON<T>(stringTask.Result);
                        }
                        else
                        {
                            Logger.Log(string.Format("SendAsyncRequest Task IsFaulted: {0} \nException: {1}", typeof(T), task.Exception));
                            UpdateError(typeof(T).ToString());
    
                            return default(T);
                        }
                    });
                }
                else
                {
                    Logger.Log(string.Format("SendAsyncRequest Task IsFaulted: {0} \nException: {1}", typeof(T), task.Exception));
                    UpdateError(typeof(T).ToString());
    
                    return default(T);
                }
            });
    }
    

更新:它确实有效,但在尝试处理故障时仍然无效。

    return httpClient.SendAsync(httpRequestMessage).ContinueWith(task =>
    {
        var response = task.Result;
        return response.Content.ReadAsStringAsync().ContinueWith(stringTask =>
        {
            var json = stringTask.Result;
            return Helper.FromJSON<T>(json);
        });
    }).Unwrap();

【问题讨论】:

  • 你为什么使用ContinueWith而不只是使用await
  • 我想返回一个'T'类型的任务,不知道如何实现,所以它被自动取消了,原因不明。
  • 这不能回答我的问题。你为什么使用ContinueWith 使用await 和一些try/catch 块可以大大简化你的整个功能。
  • 你能帮我重写代码吗?

标签: c# c#-4.0 httpclient


【解决方案1】:

Task.ContinueWith 返回继续任务:TaskTask&lt;T&gt;。如果我理解这个问题,在你的情况下,你可以这样做:

var continuation = httpResponseMessage.ContinueWith((task) =>
    {
        if (!task.IsFaulted)
        {
            HttpResponseMessage response = task.Result;
            return response.Content.ReadAsStringAsync().ContinueWith(
            (stringTask) =>
            {

            ...

continuation 最终将成为Task&lt;Task&lt;T&gt;&gt;,您可以调用.Unwrap() 将其转换为代理任务Task&lt;T&gt;

【讨论】:

  • 你能帮我完全重写代码吗,因为它在从 readasstringasync 方法返回结果时抛出错误
猜你喜欢
  • 1970-01-01
  • 2022-06-21
  • 2016-09-23
  • 1970-01-01
  • 2016-10-05
  • 2014-08-14
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多