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 = ? 返回之前不应该awaiting任务吗? @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

如何将 HttpResponseMessage 的 ByteArrayContent 下载为 zip

从 HttpResponseMessage 获取内容/消息

从 HttpResponseMessage 获取内容/消息