如何在 C# 中两次读取 Http 响应流?

     2023-02-25     43

关键词:

【中文标题】如何在 C# 中两次读取 Http 响应流?【英文标题】:How can I read an Http response stream twice in C#? 【发布时间】:2010-09-13 23:01:47 【问题描述】:

我正在尝试通过以下方式读取 Http 响应流两次:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
stream = response.GetResponseStream();
RssReader reader = new RssReader(stream);
do

  element = reader.Read();
  if (element is RssChannel)
  
    feed.Channels.Add((RssChannel)element);
  
 while (element != null);

StreamReader sr = new StreamReader(stream);
feed._FeedRawData = sr.ReadToEnd();

但是,当 StreamReader 代码执行时,没有返回任何数据,因为流现已到达末尾。我试图通过 stream.Position = 0 重置流,但这会引发异常(我认为是因为流无法手动更改其位置)。

基本上,我想解析 XML 流并访问原始数据(字符串格式)。

有什么想法吗?

【问题讨论】:

【参考方案1】:

按照Iain 的建议将流复制到MemoryStream 是正确的方法。但由于 .NET Framework 4(2010 年发布)我们有 Stream.CopyTo。文档中的示例:

// Create the streams.
MemoryStream destination = new MemoryStream();

using (FileStream source = File.Open(@"c:\temp\data.dat",
    FileMode.Open))


    Console.WriteLine("Source length: 0", source.Length.ToString());

    // Copy source to destination.
    source.CopyTo(destination);


Console.WriteLine("Destination length: 0", destination.Length.ToString());

之后,您可以随意阅读destination

// re-set to beginning and convert stream to string
destination.Position = 0;
StreamReader streamReader = new StreamReader(destination);
string text = streamReader.ReadToEnd();
// re-set to beginning and read again
destination.Position = 0;
RssReader cssReader = new RssReader(destination);

(我见过Endy's comment,但由于它是一个合适的当前答案,它应该有自己的答案条目。)

【讨论】:

【参考方案2】:

首先将其复制到一个新的 MemoryStream 中。然后,您可以根据需要多次重新读取 MemoryStream:

Stream responseStream = CopyAndClose(resp.GetResponseStream());
// Do something with the stream
responseStream.Position = 0;
// Do something with the stream again


private static Stream CopyAndClose(Stream inputStream)

    const int readSize = 256;
    byte[] buffer = new byte[readSize];
    MemoryStream ms = new MemoryStream();

    int count = inputStream.Read(buffer, 0, readSize);
    while (count > 0)
    
        ms.Write(buffer, 0, count);
        count = inputStream.Read(buffer, 0, readSize);
    
    ms.Position = 0;
    inputStream.Close();
    return ms;

【讨论】:

这里有一个小建议 - 我经常看到对 Seek 的调用,其中 Position 属性会更简单且更具可读性,例如ms.位置 = 0;只是对未来代码的想法。 另一条评论——上述内容永远不会关闭传入的流。可能值得创建一个 确实 关闭流的“CopyAndClose”方法,这样您就可以保持简单的调用语法。 哇,接近我的英雄了.. 我目前正在读你的书,Skeet 先生 :-) 你关于关闭(并用方法名称告诉)的建议正是我的想法上面的代码。 .net 4 及更高版本有更短的复制流方式:CopyTo【参考方案3】:

您是否尝试过重置流位置? 如果这不起作用,您可以将流复制到 MemoryStream 并在那里您可以根据需要随时重置位置(即重置为 0)。

【讨论】:

无法在 Rust 中两次读取子标准错误

】无法在Rust中两次读取子标准错误【英文标题】:UnabletoreadchildstderrtwiceinRust【发布时间】:2022-01-1605:31:15【问题描述】:由于某种原因,我第二次无法读取子进程stderr。这就是我所做的。我正在为黄瓜测试生成一个子进程。在... 查看详情

如何在一个 submitHandler 中两次更新反应状态

】如何在一个submitHandler中两次更新反应状态【英文标题】:HowtoupdatereactstatetwiceinonesubmitHandler【发布时间】:2018-10-2218:00:45【问题描述】:我想在React中提交一个表单,我试图用一个submitHandler更新状态两次。第二次更新依赖于第... 查看详情

如何读取和复制 HTTP servlet 响应输出流内容以进行日志记录

】如何读取和复制HTTPservlet响应输出流内容以进行日志记录【英文标题】:HowtoreadandcopytheHTTPservletresponseoutputstreamcontentforlogging【发布时间】:2012-02-1412:36:23【问题描述】:我在我的Java网络服务器(实际上是appengine)中创建了一... 查看详情

React:如何在页面中两次渲染组件?

】React:如何在页面中两次渲染组件?【英文标题】:React:Howtorenderacomponenttwiceinapage?【发布时间】:2018-01-2605:38:50【问题描述】:我在ReactmyComponent.js中有一个组件构建ReactDOM.render(<MyComponent/>,document.getElementById(\'my-id\'));在我... 查看详情

如何在 Django 中两次在查询中使用过滤器

】如何在Django中两次在查询中使用过滤器【英文标题】:howtousefilterinquerytwiceindjango【发布时间】:2022-01-1113:42:38【问题描述】:我正在尝试使用此查询过滤一些数据,get_members=PaymentDetails.objects.filter(participants_name=Participants.objects... 查看详情

如何防止在node.js中两次调用相同URL的获取

】如何防止在node.js中两次调用相同URL的获取【英文标题】:HowtopreventfetchwithsameURLbeingcalledtwiceinnode.js【发布时间】:2018-05-0110:48:10【问题描述】:我要对后端进行x次调用。其中一些指向相同的URL。我正在缓存结果。但我的问题... 查看详情

如何从 Vuejs 读取流 + json 响应?

】如何从Vuejs读取流+json响应?【英文标题】:Howtoreadstream+jsonresponsesfromVuejs?【发布时间】:2019-03-1901:35:10【问题描述】:我在vuejs应用程序中使用axioshttp客户端和这段代码:axios.get(\'http://localhost:8081/pets\').then(response=>this.pets=re... 查看详情

node.js之http请求与响应

...务端发起请求相当于向服务端写入一个流(writable)2.服务端读取客户端的流(readable)3.服务端向客户端作出响应相当于向客户端写入一个流(writable)4.客户端读取服务端的响应(readable)整个流程分为两部分一是客户端的处理而是服务端... 查看详情

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

】如何在同一列或不同列的一个sql语句中两次使用\\\'BETWEEN\\\'条件【英文标题】:howtouse\'BETWEEN\'condetiontwotimesinonesqlstatementforsamecolumnordiffrentcolumns如何在同一列或不同列的一个sql语句中两次使用\'BETWEEN\'条件【发布时间】:2011-05-... 查看详情

如何在 Codeigniter 中两次加入同一个表并分配表别名?

】如何在Codeigniter中两次加入同一个表并分配表别名?【英文标题】:HowtojointhesametabletwiceandassigntablealiasesinCodeigniter?【发布时间】:2012-02-2719:49:57【问题描述】:我正在尝试使用PyroCms在Codeigniter中创建一个邮件系统。在我的邮件... 查看详情

如何在 C# 中使用 HttpClient 读取 Web api 响应

】如何在C#中使用HttpClient读取Webapi响应【英文标题】:HowtoreadwebapiresponseswithHttpClientinC#【发布时间】:2016-08-2609:01:57【问题描述】:我对webapi还很陌生,并且开发了一个小型webapi,它有一些操作并返回我的自定义类Response。Respons... 查看详情

如何在 C# 中将字符串转换为 HTTP 响应?

】如何在C#中将字符串转换为HTTP响应?【英文标题】:HowdoIconvertastringintoanHTTPResponseinC#?【发布时间】:2020-04-1700:49:28【问题描述】:"AdditionalProcessCardSwipeResponseData":null,"CustomerTransactionID":"","ProcessCardSwipeOutputs":["AdditionalProces 查看详情

Java 输入流读取两次

...输入流中读取第一行并将其存储到字符串变量中。然后我如何读取剩余的行并复制到另一个输入流以进一步处理。InputStreamis1=null;BufferedReaderreader=null;Stringtodecrypt=null;ByteArrayOutputStreambao 查看详情

如何使用 SpeechSynthesizer C# 将音频流写入响应

】如何使用SpeechSynthesizerC#将音频流写入响应【英文标题】:HowtowriteaudiostreamouttoresponseusingSpeechSynthesizerC#【发布时间】:2014-03-0501:54:51【问题描述】:我在C#asp.net应用程序中使用SpeechSynthesizer类尝试将一些文本转换为语音,然后... 查看详情

在内容 100% 完成之前从 HttpResponseMessage 读取标头

...tis100%complete【发布时间】:2013-03-1217:30:00【问题描述】:如何在整个响应流回之前访问响应标头?如何在流到达时读取它?对于接收http响应的这种精细控制,HttpClient是我的最佳选择吗?这是一个可以说明我的问题的片段:us 查看详情

停止 SQL 在 JOIN 中两次返回相同的结果

...取我想要的数据,但由于我是SQL新手,所以我无法弄清楚如何停止多次返回数据。她的SQL语句;SELECTT.url,T.ID,S.status,S.ID,E.action,E.ID,E.timestampFRO 查看详情

对话流和 C#。如何获得代理的回复?

】对话流和C#。如何获得代理的回复?【英文标题】:DialogflowandC#.HowdoIgetaresponsefromanagent?【发布时间】:2019-10-2716:34:37【问题描述】:我想用C#编写一个应用程序,我可以在其中向我的机器人发送消息并获得响应。如何发送请求... 查看详情

如何计算 Git 中两次提交之间更改的行数?

】如何计算Git中两次提交之间更改的行数?【英文标题】:HowcanIcalculatethenumberoflineschangedbetweentwocommitsinGit?【发布时间】:2011-02-0110:56:14【问题描述】:有没有简单的方法来计算Git中两次提交之间更改的行数?我知道我可以做一... 查看详情