C# 从 HttpResponseMessage 读取
Posted
技术标签:
【中文标题】C# 从 HttpResponseMessage 读取【英文标题】:C# read from HttpResponseMessage 【发布时间】:2014-07-16 11:33:37 【问题描述】:我第一次使用 .net 的 Httpclient,发现它很难。我已经设法调用服务器并从它接收响应,但一直停留在从响应中读取。这是我的代码:
if (Method == HttpVerb.POST)
response = client.PostAsync(domain, new StringContent(parameters)).Result;
else
response = client.GetAsync(domain).Result;
if (response != null)
var responseValue = string.Empty;
Task task = response.Content.ReadAsStreamAsync().ContinueWith(t =>
var stream = t.Result;
using (var reader = new StreamReader(stream))
responseValue = reader.ReadToEnd();
);
return responseValue;
responseValue 中包含 ,尽管服务正在返回数据。我应该如何解决这个问题?
该项目在 .Net 4 中。
【问题讨论】:
您使用的是 wcf 服务还是 Web 服务?响应状态如何? responseValue.StatusCode = ? 返回之前不应该await
ing任务吗?
@PrinceT 我正在呼叫休息服务
@DavidG 我应该在哪里使用 await?好吧,我把 await VS 放在哪里都显示错误 await 运算符只能在异步方法中使用
@Haris 因为你的函数不是异步的,所以使用Task.Wait()
,检查我的答案。
【参考方案1】:
您正在创建一个异步任务,但在返回之前没有等待它完成。这意味着您的 responseValue
永远不会被设置。
要解决此问题,请在返回之前执行以下操作:
task.Wait();
所以你的函数现在看起来像这样:
if (Method == HttpVerb.POST)
response = client.PostAsync(domain, new StringContent(parameters)).Result;
else
response = client.GetAsync(domain).Result;
if (response != null)
var responseValue = string.Empty;
Task task = response.Content.ReadAsStreamAsync().ContinueWith(t =>
var stream = t.Result;
using (var reader = new StreamReader(stream))
responseValue = reader.ReadToEnd();
);
task.Wait();
return responseValue;
如果您更喜欢使用await
(您可能应该这样做),那么您需要创建此代码包含在async
中的函数。所以这个:
public string GetStuffFromSomewhere()
//Code above goes here
task.Wait();
变成:
public async string GetStuffFromSomewhere()
//Code above goes here
await ...
【讨论】:
不,还是一样 :(。但是它与 WebRequest 完美配合,但我不得不转移到 HttpClient 的问题是使用 WebRequest 我无法读取 cookie。ContinueWith
中的函数是否正在执行?
是的,它正在执行。注意到 t.Result.Length 里面有 2
推荐阅读这篇文章了解如何使用HttpClient:asp.net/web-api/overview/web-api-clients/…
好的,我通过更改域和参数获取了数据。域从http://mydomain.com:38080/workshop/
更改为http://mydomain.com:38080/workshop/rest/login
,参数从rest/login?username=usr&password=pwd
更改为username=usr&password=pwd
。这是为什么?这将产生获取 cookie 的问题,因为它们是在域级别设置的【参考方案2】:
试试这个
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(obj.Url);
HttpWebResponse response = null;
try
response = request.GetResponse() as HttpWebResponse;
catch (Exception ex)
【讨论】:
WebRequest
在新的HttpClient
可用时不应使用。此外,这并不能回答所提出的问题。
我以前使用过 WebRequest,但我无法读取 cookie,这就是为什么要迁移到 HttpClient。否则 WebRequest 可以完美运行。以上是关于C# 从 HttpResponseMessage 读取的主要内容,如果未能解决你的问题,请参考以下文章
C# 无法通过 HttpResponseMessage 获取 HTTP 返回代码
如何在 C# 中正确检查 HttpResponseMessage 的 http 状态代码?
读取 webapi 2 令牌时读取 HttpResponseMessage.Content 会引发 Newtonsoft.Json.JsonReaderException