Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读写web api响应流的正确方法_C#_Asp.net Web Api_Stream - Fatal编程技术网

C# 读写web api响应流的正确方法

C# 读写web api响应流的正确方法,c#,asp.net-web-api,stream,C#,Asp.net Web Api,Stream,我在寻找正确的咒语时遇到了一些问题,这些咒语允许我写入响应流,然后在测试中读取内容。现在我有这个 var res = new HttpResponseMessage(System.Net.HttpStatusCode.OK); var ms = new MemoryStream(); res.Content = new StreamContent(ms); using (var sw = new StreamWriter(ms, System.Text.Encoding.UTF8)) using

我在寻找正确的咒语时遇到了一些问题,这些咒语允许我写入响应流,然后在测试中读取内容。现在我有这个

var res = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
var ms = new MemoryStream();
res.Content = new StreamContent(ms);
using (var sw = new StreamWriter(ms, System.Text.Encoding.UTF8))
using (var csv = new CsvHelper.CsvWriter(sw))
  csv.WriteRecords(allData.ToList());
return res;
在我的测试中,我试图阅读这个回答

  var controller = appContainer().Resolve<MyController>();
  var res = (await controller.Get()) as HttpResponseMessage;
  res.ShouldNotEqual(null);
  var csv = await res.Content.ReadAsStringAsync();
这里有几件事

  • 为什么会发生此错误?我如何在测试中正确防止它
  • MemoryStream
    的使用不适合我,我是否应该能够直接写入内容流?
    MemoryStream
    是否有可能极大地提高我的内存使用率

尽管这并不完美,但还是把它放在那里吧。。。使用PushStreamContent做了很多工作,但它也带来了自己的头疼问题——即匿名方法可能产生的任何异常都会被吞没,并且在没有对问题进行完整描述的情况下很难追踪。炸弹爆炸时,web api未经处理的异常处理程序将在管道中生效,而xmlhttprequest似乎无法识别关闭

比如说

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new PushStreamContent((stream, content, context) =>
{
     // write your output here
});
return response;
只要内部方法永远不会出错或以任何方式出错,你就会得到你想要的

PushStreamContent会在调用匿名方法之前立即刷新您的http头,因此您会被分块,以后无法将其返回


您可以在匿名方法中添加一个try/catch,以便在出现问题时给自己留个便条,但根据我的经验,XmlHttpRequest无法识别远程服务器何时强制关闭请求,因此它会继续等待。当我把Fiddler放进去的时候,Fiddler才开始弄清楚到底发生了什么,Fiddler咯咯叫了起来。

把这个放出来,尽管它并不完美。。。使用PushStreamContent做了很多工作,但它也带来了自己的头疼问题——即匿名方法可能产生的任何异常都会被吞没,并且在没有对问题进行完整描述的情况下很难追踪。炸弹爆炸时,web api未经处理的异常处理程序将在管道中生效,而xmlhttprequest似乎无法识别关闭

比如说

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new PushStreamContent((stream, content, context) =>
{
     // write your output here
});
return response;
只要内部方法永远不会出错或以任何方式出错,你就会得到你想要的

PushStreamContent会在调用匿名方法之前立即刷新您的http头,因此您会被分块,以后无法将其返回


您可以在匿名方法中添加一个try/catch,以便在出现问题时给自己留个便条,但根据我的经验,XmlHttpRequest无法识别远程服务器何时强制关闭请求,因此它会继续等待。当我把Fiddler放进去的时候,Fiddler才开始弄清楚到底发生了什么,Fiddler发出嘎嘎声。

using语句导致流被释放。内存使用率不能翻倍。内容的流就是您分配给它的流。检查来源code@Nkosi假设我正在写10MB的CSV。我需要一块10MB的内存来缓冲这些。但是坚持住!我可以在不将整个csv渲染到内存中的情况下开始发回身体的各个部分,因此我实际上不需要一次完成整个10MB,而是需要一个更小的移动窗口。这就是您使用
FileStreamResult
所做的,我希望在这里获得类似的效率。@GeorgeMauer您找到解决方案了吗?你在这篇文章中做了类似的评论,但是没有发布解决方案。@Nse只是检查了我最终做了什么,我确实使用了内存流。但是,我不确定这是否是asp.net web api问题-这可能是一个
CsvHelper
错误,因为处理
CsvWriter
会关闭底层流。未来的版本可以选择不这样做,但我已经查看了代码和我正在使用的版本(2.16.3.0)。实际上,可以不进行sposed,刷新streamwriter,并重置memorystream位置
using
语句会导致流被释放。内存使用量不会翻倍。内容的流就是您分配给它的流。检查来源code@Nkosi假设我正在写10MB的CSV。我需要一块10MB的内存来缓冲这些。但是坚持住!我可以在不将整个csv渲染到内存中的情况下开始发回身体的各个部分,因此我实际上不需要一次完成整个10MB,而是需要一个更小的移动窗口。这就是您使用
FileStreamResult
所做的,我希望在这里获得类似的效率。@GeorgeMauer您找到解决方案了吗?你在这篇文章中做了类似的评论,但是没有发布解决方案。@Nse只是检查了我最终做了什么,我确实使用了内存流。但是,我不确定这是否是asp.net web api问题-这可能是一个
CsvHelper
错误,因为处理
CsvWriter
会关闭底层流。未来的版本可以选择不这样做,但我已经查看了代码和我正在使用的版本(2.16.3.0)。实际上,可以不进行任何更改,刷新streamwriter并重置memorystream位置