C#,清除HttpListenerContext.Response.OutputStream

时间:2018-02-03 17:21:13

标签: c# http server

我有一个使用HttpListener的网络服务。

我注意到了这件事:

HttpListenerContext context = listener.GetContext();
...
context.Response.StatusCode = 200;
context.Response.OutputStream.Write(buffer, 0, bufferSize);
context.Response.StatusCode = 500;
context.Response.OutputStream.Close();

在这种情况下,客户端收到状态代码200,所以如果我已经将一些数据写入输出网络流,我就无法更改状态代码,因为我认为它已经写入了响应流

我想要的是:在我开始编写对输出流的响应之后,在某些情况下我想要"中止并重置"响应,清除输出流(因此客户端不会在HTTP响应正文中接收任何数据),并更改状态代码。

我不知道如何清除输出流并更改状态代码。下面这两行不会有帮助,他们会抛出异常。

context.Response.OutputStream.SetLength(0);
context.Response.OutputStream.Position = 0;

我想,在我调用了context.Response.OutputStream.Close()之后程序将缓冲区数据写入网络设备,直到这个数据存储在RAM中我们可以重置它,不能吗? / p>

编辑:似乎写入context.Response.OutputStream有时需要花费太多时间,在某些情况下。从100到1000毫秒...这就是为什么我会中断写作,如果可能的话。

1 个答案:

答案 0 :(得分:1)

您可以使用MemoryStream来缓存答案,如果您确定它已完成,请将状态设置为200并将其返回(例如使用Stream.CopyTo)。

你不能“清除”OutputStream,因为它没有存储(很长时间),而是立即发送到客户端,所以你不能再编辑它了。

除此之外,HTTP没有提供一种方法来优雅地说“DATADATADATA ......哦,忘了,这是错误的,改为使用状态代码500。”。您只能尝试终止TCP连接(TCP RST而不是TCP FIN)并希望客户端在处理完您已经发送的数据后,以合适的方式处理无法继续读取连接的问题

在关闭之前尝试context.Response.Abort(),这将不允许您设置状态代码,但至少会传达出错的地方。