2012-08-10 44 views
2

我用来结束我的传输到客户端通过冲洗和结束在下面的代码。如果我之后直接使用`Response.End()`,`Response.Flush()`有意义吗?

Response.Flush(); 
Response.End(); 

然而,它只是打我,Response.End()刷新缓存内容到客户端。那么在序列中使用两者有什么意义?

+0

是到Response.End异常结束和调用事件EndRequest。 Response.Flush:发送到客户端的所有当前缓冲输出力 – 2012-08-10 01:18:09

+2

您应该在HttpApplication对象上使用'CompleteRequest()'来结束请求(并且如果需要,请继续处理)。不要使用'Response.End'。阅读原因。被接受的答案最终会使用它,但是有没有一个很好的理由让你使用异常来终止响应线程? – 2012-08-10 02:48:09

+0

@AndrewBacker不,没有。除非你指望“我一直这样做,所以它会自动使用它”,这是一个非常好的理由。你的意思是应该先冲洗然后完成,对吧?我只会去Response.ContentType =“text/xml”;回复于(GetXmlData()InnerXml。); Response.Flush(); Context.ApplicationInstance.CompleteRequest(); 伟大的信息。 – 2012-08-10 09:37:57

回答

4

总之,没有,但有两个之间的重要区别:

Response.Flush()为所有处理完成之前写入的响应的部分有用的(即,如果响应缓冲被禁用)。 Flush()之后的任何代码都将继续执行,并且任何之前的Response.Write()都将刷新到客户端。

Response.End()更残酷一点......它不仅会中止当前线程,而且会这样做会抛出ThreadAbort异常并终止当前请求。除非您正确处理异常,否则Response.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(); 
     } 
    } 
} 
相关问题