C# 如果直接在后面使用`Response.End()`则`Response.Flush()`有意义吗?
我使用以下代码刷新并结束向客户端的传输C# 如果直接在后面使用`Response.End()`则`Response.Flush()`有意义吗?,c#,asp.net,C#,Asp.net,我使用以下代码刷新并结束向客户端的传输 Response.Flush(); Response.End(); 然而,我突然想到了这个响应。End将缓冲内容刷新到客户端。那么,在一个序列中使用这两种方法有什么意义呢?简言之,没有,但两者之间有重要的区别: Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端 回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。
Response.Flush();
Response.End();
然而,我突然想到了这个响应。End将缓冲内容刷新到客户端。那么,在一个序列中使用这两种方法有什么意义呢?简言之,没有,但两者之间有重要的区别: Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端 回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。响应.End之后的任何代码都将永远看不到曙光,除非您正确处理异常 正如您所指出的,End无论如何都会刷新您的缓冲内容。在某些情况下,如果上下文不可取消,End实际上会在内部调用Flush:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
简言之,没有,但两者之间有重要区别: Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端 回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。响应.End之后的任何代码都将永远看不到曙光,除非您正确处理异常 正如您所指出的,End无论如何都会刷新您的缓冲内容。在某些情况下,如果上下文不可取消,End实际上会在内部调用Flush:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
End是线程的异常结束,并调用事件EndRequest。Response.Flush:发送到客户端的所有当前缓冲输出力您应该在HttpApplication对象上使用CompleteRequest来结束请求并继续处理(如果需要)。不要使用Response.End。仔细阅读原因。被接受的答案最终会使用它,但您使用异常终止响应线程是否真的有很好的理由?@AndrewBacker不,没有。除非你算了,否则我总是这么做,所以它自然而然地成为了一个很好的理由。你是说一个人应该先冲水然后完成,对吗?我将直接转到Response.ContentType=text/xml;Response.WriteGetXmlData.InnerXml;回答:齐平;Context.ApplicationInstance.CompleteRequest;很好的信息。是的,这将关闭它并同时刷新,基本上只需跳到处理结束。End是我们在经典asp中使用的,我认为它只是延续了下来。直到几年前我才遇到CompleteRequest。。。可能在示例中有,但我只是跳过了它,因为我已经知道了哈。事实上,我在提供XML文件并完成CompleteRequest时出错,所以我被迫将其更改回去。我不知道为什么它不起作用。关于非法字符的某些信息…Response.End是线程的异常结束,并调用事件EndRequest。Response.Flush:发送到客户端的所有当前缓冲输出力您应该在HttpApplication对象上使用CompleteRequest来结束请求并继续处理(如果需要)。不要使用Response.End。仔细阅读原因。被接受的答案最终会使用它,但您使用异常终止响应线程是否真的有很好的理由?@AndrewBacker不,没有。除非你算了,否则我总是这么做,所以它自然而然地成为了一个很好的理由。你是说一个人应该先冲水然后完成,对吗?我将直接转到Response.ContentType=text/xml;Response.WriteGetXmlData.InnerXml;回答:齐平;Context.ApplicationInstance.CompleteRequest;很好的信息。是的,这将关闭它并同时刷新,基本上只需跳到处理结束。End是我们在经典asp中使用的,我认为它只是延续了下来。直到几年前我才遇到CompleteRequest。。。可能在示例中有,但我只是跳过了它,因为我已经知道了哈。事实上,我在提供XML文件并完成CompleteRequest时出错,所以我被迫将其更改回去。我不知道为什么它不起作用。一些关于非法字符的信息。。。