2012-06-19 13 views
7

Questa è un'altra variante della stessa domanda in cui si verifica un'eccezione StackOverflow come risultato della dimensione dello stack 256K durante l'esecuzione in IIS. Questo problema non è nuovo ed è stato chiesto più volte (here e here)Errore StackOverflow IIS

La mia domanda è un po 'diversa. L'eccezione viene generata quando un client richiede dati e il servizio WCF in esecuzione su IIS 7 tenta di serializzare un grafo di oggetto piuttosto grande. In realtà si verifica durante la serializzazione

posso facilmente riprodurre il problema nell'ambiente di sviluppo eseguendo un recupero/serializzare di routine in un thread con una dimensione dello stack limitata:

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); 
} 

Questo simula l'eccezione StackOverflow come in IIS. Quando cambio il parametro stackSize passato al costruttore del thread su 1MB, funziona bene ...

La mia domanda è come si può farlo all'interno di un metodo di servizio WCF? In altre parole, nel mio metodo di servizio WCF non creo esplicitamente un serializzatore e chiamo WriteObject. Come/dove posso fare lo stesso tipo di lavoro in un thread in cui posso controllare lo stackSize?

Grazie!

risposta

1

È possibile modificare la dimensione di stack predefinita modificando l'intestazione PE dell'eseguibile. Utilizzare editbin.exe con l'argomento/stack. Vedi http://msdn.microsoft.com/en-us/library/35yc2tc3(v=vs.80).aspx

+0

Grazie per la risposta rapida, ma preferirei risolvere questo problema nel codice. Ho provato editbin.exe con l'opzione/stack, ma ho riscontrato problemi di autorizzazione poiché l'applicazione w3wp si trova nella cartella system32. Non ero in grado di aggiornare il file. Inoltre, se dovessero installare una patch o un aggiornamento su IIS, le nostre modifiche verrebbero sovrascritte. Qualche idea su come potrebbe essere risolto a livello di programmazione? –

+0

@JohnRussell: ho avuto l'impressione che non si potesse modificare la creazione del thread. In questo caso, l'unica opzione di cui sono a conoscenza è la modifica dell'immagine. Forse dovresti fare auto hosting e modificare quel file binario invece di IIS. –

+0

Potrei essere in grado di modificare la creazione del thread, ma non sono sicuro di come o dove si ottiene ciò in un processo ospitato da IIS. Non esiste una dichiarazione esplicita che crea un serializzatore e chiama WriteObject(). –