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!
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? –
@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. –
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(). –