2012-06-19 17 views
7

Jest to kolejna odmiana tego samego pytania, w której występuje wyjątek StackOverflow w wyniku rozmiaru stosu 256 kB podczas działania w IIS. Ten problem nie jest niczym nowym i został kilkakrotnie zapytany (here i here)wyjątek IIS StackOverflow

Moje pytanie jest trochę inne. Wyjątek jest generowany, gdy klient żąda danych, a usługa WCF działająca pod IIS 7 próbuje serializować raczej duży wykres obiektów. To faktycznie występuje podczas serializacji

można łatwo odtworzyć problem w środowisku rozwoju, uruchamiając odzyskać/serializacji rutynowych w wątku o ograniczonej wielkości stosu:

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

Symuluje to wyjątek StackOverflow jak w IIS. Kiedy zmienię parametr stackSize przekazany do konstruktora wątku na 1MB, działa dobrze ...

Moje pytanie brzmi: jak można to zrobić wewnątrz metody usługi WCF? Innymi słowy, w mojej metodzie usługi WCF nie jawnie utworzyć serializera i wywołać WriteObject. Jak/gdzie mogę wykonać ten sam rodzaj pracy w wątku, w którym mogę kontrolować stackSize?

Dzięki!

Odpowiedz

1

Możesz zmienić domyślny rozmiar stosu, zmieniając nagłówek PE pliku wykonywalnego. Użyj editbin.exe z argumentem/stack. Zobacz http://msdn.microsoft.com/en-us/library/35yc2tc3(v=vs.80).aspx

+0

Dziękuję za szybką odpowiedź, ale wolę rozwiązać ten problem w kodzie. Próbowałem editbin.exe przy użyciu przełącznika/stack, ale wystąpiły problemy z uprawnieniami, ponieważ aplikacja w3wp znajduje się w folderze system32. Nie mogłem zaktualizować pliku. Ponadto, jeśli mieli zainstalować łatę lub aktualizację w IIS, nasze zmiany zostaną nadpisane. Jakieś przemyślenia na temat tego, jak można je rozwiązać programowo? –

+0

@JohnRussell: Odniosłem wrażenie, że nie można zmodyfikować tworzenia wątku. Jeśli tak jest, jedyną dostępną opcją jest modyfikacja obrazu. Być może zrobiłbyś sam hosting i zmodyfikujesz ten plik binarny zamiast IIS. –

+0

Mogę zmodyfikować tworzenie wątku, ale nie jestem pewien, jak to się robi w procesie obsługiwanym przez IIS. Nie ma wyraźnej instrukcji, która tworzy serializator i wywołuje WriteObject(). –