2012-10-12 40 views
0

我想手動編寫我的響應流並關閉它,以便我可以在響應關閉後繼續做一些東西。我成功達致這通過執行以下操作:手動寫流沒有CHUNKED響應

Response.StatusCode = 200 
Response.ContentType = "application/json; charset=utf-8" 
Response.Write(j) 
Response.Flush() 
Response.Close() 
DOWORK() 

這在大多數情況下完美的,但Chrome瀏覽器/ Flash中,存在閃存中的錯誤是它是造成這種假定它是一個IO錯誤。當分析報頭,之間手動發送響應與返回JSON(結果)和差I如何做它上面是,當我返回數據通常它使用的報頭:

Content-Length: 44 

凡爲當我發送它與上面的代碼我得到:

Transfer-Encoding: chunked 

是否有可能做我想要的但沒有數據塊?我知道這不是ASP.net特定的,而是閃存中的一個bug,但我想解決這個問題。

+0

; 「 MVC幫手,而不是手動響應?你可以實現你自己的繼承自JsonResult的ActionResult以在Execute方法被調用後添加一些工作 – PanJanek

+0

如果我做了「返回JSON(obj)」,那麼方法在那裏停止執行。我明白你的迴應說我可以從ActionResult繼承事件後繼續,但不知道我該怎麼做?我唯一能想到的方式是在返回結果之前啓動一個後臺工作者。 –

回答

1

按照我的意見,我在想是這樣的:

public class CustomResult : JsonResult 
{ 
    private Action afterAction; 
    private object obj = null; 

    public CustomResult(object obj, Action afterAction) : base() 
    { 
     this.JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet; 
     this.Data = obj; 
     this.afterAction = afterAction; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     base.ExecuteResult(context); 
     afterAction(); 
    } 
} 

現在,你可以把它的控制器動作:你爲什麼不能使用「返回JSON(OBJ)

return new CustomResult(obj,() => { //custom code here, will be executed later }); 
+0

我很遺憾現在沒有時間來測試它。是要求未來的測試,但是我會將其標記爲完整的,因爲只要它按照概述工作,base.ExecuteResult(上下文)關閉連接,它應該按照我的需要完成。謝謝! –