【发布时间】:2015-03-21 13:39:39
【问题描述】:
我正在尝试使用 HttpClient 类获取/发布并面临以下问题
- 不知道如何从 HttpResponseMessage.Content.ReadAsStringAsync().ContinueWith() 方法返回任务。
-
由于某种原因,它一直在自动取消
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