2012-06-19 58 views
7

這是在IIS下運行時由於256K堆棧大小而導致StackOverflow異常的同一問題的另一種變體。這個問題不是什麼新東西,它已被問了好幾次(herehereIIS StackOverflow異常

我的問題有點不同。當客戶端請求數據並且在IIS 7下運行的WCF服務嘗試序列化一個相當大的對象圖時,會引發異常。它實際上系列化

我可以很容易地通過運行重現此問題在開發環境中發生檢索/序列化程序的線程具有有限的堆棧大小:

static void Main(string[] args) 
{ 
    Thread t = new Thread(DoWork, 262144); 
    t.Start(); 
    t.Join(); 
    Console.ReadLine(); 
} 

private static void DoWork() 
{ 
    var dataAccess = new DataAccess(); 

    var data = dataAccess.LoadData(); 

    var serializer = new DataContractSerializer(typeof(List<Data>), null, int.MaxValue, false, true, new DataContractSurrogate()); 

    var memoryStream = new MemoryStream(); 
    serializer.WriteObject(memoryStream, data); 
} 

這模擬的StackOverflow例外,就像在IIS中。當我將傳遞給線程構造函數的stackSize參數更改爲1MB時,它工作正常......

我的問題是如何在WCF服務方法中做到這一點?換句話說,在我的WCF服務方法中,我沒有明確創建序列化器並調用WriteObject。在我可以控制stackSize的線程中,我如何/在哪裏可以做同樣的工作?

謝謝!

回答

1

您可以通過更改可執行文件的PE標頭來修改默認堆棧大小。使用editbin.exe和/ stack參數。請參閱http://msdn.microsoft.com/en-us/library/35yc2tc3(v=vs.80).aspx

+0

感謝您的快速回復,但我寧願在代碼中解決此問題。我使用/ stack開關嘗試了editbin.exe,但由於w3wp應用程序位於system32文件夾中,所以遇到了權限問題。我無法更新文件。另外,如果他們要在IIS上安裝補丁或更新,我們的更改將被覆蓋。有關如何以編程方式解決的任何想法? –

+0

@JohnRussell:我覺得你不能修改線程的創建。如果是這種情況,我知道的唯一選擇是修改圖像。也許你會做自我託管和修改,而不是IIS的二進制文件。 –

+0

我可能能夠修改線程的創建,但我只是不確定在IIS託管的進程中如何或在哪裏完成。沒有創建序列化程序並調用WriteObject()的明確聲明。 –