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