【问题标题】:Remove headers from HttpClient response从 HttpClient 响应中删除标头
【发布时间】:2019-11-12 20:11:54
【问题描述】:

我在使用 HttpClient 时遇到问题。通话正常,我得到了答复,但我无法正确获取内容。

我写的函数是这样的:

    public async Task<string> MakePostRequestAsync(string url, string data, CancellationToken cancel)
    {
        String res = String.Empty;

        using (HttpClient httpClient = new HttpClient())
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

            HttpContent content = new StringContent(data, Encoding.UTF8, "application/xml");
            httpClient.DefaultRequestHeaders.Authorization = getHeaders();
            httpClient.DefaultRequestHeaders.Add("Accept", "application/xml");
            httpClient.DefaultRequestHeaders.Add("User-Agent", "C#-AppNSP");
            httpClient.DefaultRequestHeaders.ExpectContinue = false;

            HttpResponseMessage response = await httpClient.PostAsync(url, content, cancel);
            response.EnsureSuccessStatusCode(); // Lanza excepción si no hay éxito

            res = await response.Content.ReadAsStringAsync();
            if (String.IsNullOrEmpty(res))
            {
                throw new Exception("Error: " + response.StatusCode);
            }
        }

        return res;
    }

我得到的响应字符串和这个类似:

HTTP/1.1 0 nullContent-Type: application/xml;charset=UTF-8
Content-Length: 1263
Date: Tue, 02 Jul 2019 07:48:07 GMT
Connection: close

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SeguimientoEnviosFechasResponse xsi:noNamespaceSchemaLocation="SeguimientoEnviosFechasResponse.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Error>0</Error>
    <MensajeError></MensajeError>
    <SeguimientoEnvioFecha>
        <!-- more XML here -->
    </SeguimientoEnvioFecha>
</SeguimientoEnviosFechasResponse>

由于某种原因,该字符串包含标头,因此当我尝试反序列化它时会出错。

如何在响应字符串中删除此标头?

【问题讨论】:

  • 响应字符串中的Headers 是什么意思?
  • 前 4-5 行:HTTP/1.1 ...... 连接:关闭。此部分无法解析为 XML。
  • 使用这个:res = await response.Content.ReadAsStringAsync().Result;
  • 同样的结果。我不得不删除“等待”关键字。 res = response.Content.ReadAsStringAsync().Result;
  • 您必须将数据加载到 XDocument 中,然后对其进行解析。您可以使用ReadAsStreamAsync 将流读入XmlDocumentstring content= res.Content.ReadAsStreamAsync().Result; XDocument responseXml= XDocument.Load(content);

标签: c# .net xml-parsing dotnet-httpclient webservice-client


【解决方案1】:

您的服务器在响应正文中返回标头。最好在服务器端解决这个问题,如果不可能,您应该从响应中提取正文:

        var xml = res.Substring(res.IndexOf("<?xml", StringComparison.Ordinal));

【讨论】:

  • 这就是我真正在做的事情。好像有什么问题。我无法修复服务器端代码。真的不知道为什么标题写在正文中:S
【解决方案2】:

你可以试试这个:

using (var receiveStream = response.GetResponseStream()) 
{
  using (var readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
  {
    Console.WriteLine (readStream.ReadToEnd ());
  }
}

【讨论】:

  • 这种情况下的反应是什么?对于 HttpResponseMessage,没有这样的方法 GetResponseStream()。它可能是 response.Content.ReadAsStreamAsync() 但使用它没有任何好处(我相信)。
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 2013-12-09
  • 2019-03-04
  • 2018-07-09
  • 2011-02-13
  • 2011-12-18
  • 2018-06-11
  • 2017-07-11
相关资源
最近更新 更多