2010-06-09 65 views
2

我需要爲從WCF Web服務返回的大量數據提供對excel功能的導出。將數據從WCF服務導出到excel

加載DataList控件的代碼如下:

List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl); //call to WCF service 
myDataList.DataSource = r; 
myDataList.DataBind(); 

我使用的效應初探對象做的工作:

Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment; filename=MyExcel.xls"); 
StringBuilder sb = new StringBuilder(); 
StringWriter sw = new StringWriter(sb); 
HtmlTextWriter tw = new HtmlTextWriter(sw); 
myDataList.RenderControl(tw); 
Response.Write(sb.ToString()); 
Response.End(); 

的問題是,WCF服務超時的大量的數據(大約5000行),結果集爲空。當我調試服務時,我可以看到保存/打開Excel表單的窗口出現在服務返回結果之前,因此Excel表單始終爲空。請幫我弄清楚這一點。

編輯添加 - 用於重寫URL的WCF站點的IHttpModule被調用兩次或三次。這可能是因爲aspnet_wp回收?在這種情況下,我應該看到我的應用程序事件日誌中的錯誤,對吧?但我不知道。請幫我解決這個問題。

這裏是我的自定義的HttpModule: 公共類CustomHttpModule:IHttpModule的{ 公共 無效的Dispose(){}

public void Init(HttpApplication appln) 
{ 
    appln.AuthorizeRequest+= delegate 
    { 
     HttpContext tcontext= HttpContext.Current; 
     string path = tcontext.Request.AppRelativeCurrentExecutionFilePath; 

     int i = path.IndexOf('/', 2); 
     if (i > 0) 
     { 
      string svc = path.Substring(0, i) + ".svc"; 
      string fu = path.Substring(i, path.Length - i); 
      tcontext.RewritePath(svc, fu, tcontext.Request.QueryString.ToString(), false); 
     } 
    }; 
} 

}

我看到appln.AuthorizeRequest被調用了兩次。我認爲這就是爲什麼我看到操作超時或連接關閉異常。我如何阻止它做兩次。我只創建一個請求。

回答

0

Tor的回答對我有點幫助。我必須將MaxItemsInObjectGraph設置爲更高的值才能消除此異常。但是,我無法設置此值,因爲我沒有如何設置它以及在哪裏設置它。

article幫助我瞭解有關WCF Rest服務和節流的更多信息。實際上,我爲我的服務類別設置了ServiceBehavior屬性。

[ServiceBehavior(MaxItemsInObjectGraph=2147483646)] 
public abstract class MyService: IMyService 

{ 等等... }

如果你不關心不得不一遍又一遍地修改最大限制,你可以快樂地與代碼中指定,並有樂趣看到這一切工作。

1

您已經遇到了許多種WCF/IIS超時和限制之一。這個特定的可能是MaxReceivedMessageSize。默認值是64 KB。在服務的綁定上進行配置。

其它限制是(這些是不是所有的結合參數):

  • MaxItemsInObjectGraph(65536)
  • 的maxRequestLength(4 MB)
  • executionTimeout(90秒)
  • 的SendTimeout在客戶端( 10分鐘)
+0

我得到「底層連接已關閉」異常。這是一個REST WCF服務,所以我不得不改變HttpRequest的時間。有一點奇怪的是請求調用只做了一次,但服務方法被擊中兩次或三次,直到出現此異常。我不明白爲什麼會發生這種情況。我甚至將KeepAlive設置爲false,因爲我認爲請求調用是爲了保持連接處於活動狀態,直到數據返回。這僅在導出大量數據時發生。可能有解決方法,但我想知道如何解決現有問題,而不是開始解決問題。 – Dave 2010-06-15 18:11:34

+0

我編輯了我的問題。我發現在導出整個數據時,IHttpModule的init會被調用兩次或三次。當數據相對較小時不會發生這種情況。這可能是aspnet_wp回收。如果是這樣,我該如何解決它? – Dave 2010-06-16 17:43:45