Это еще один вариант того же вопроса, когда возникает исключение StackOverflow из-за размера стека 256 КБ при работе под IIS. В этом вопросе нет ничего нового, и его задавали несколько раз (здесьи здесь)
Мой вопрос немного отличается. Исключение возникает, когда клиент запрашивает данные, а служба WCF, работающая под управлением IIS 7, пытается сериализовать довольно большой граф объектов. На самом деле это происходит во время сериализации.
Я могу легко воспроизвести проблему в среде разработки, запустив процедуру извлечения/сериализации в потоке с ограниченным размером стека:
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), null, int.MaxValue, false, true, new DataContractSurrogate());
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, data );
}
Это имитирует исключение StackOverflow, как и в IIS. Когда я изменяю параметр stackSize, переданный конструктору Thread, на 1 МБ, все работает нормально...
Мой вопрос: как это можно сделать внутри метода службы WCF? Другими словами, в моем сервисном методе WCF я не создаю сериализатор явно и не вызываю WriteObject. Как/где я могу сделать такую же работу в потоке, где я могу контролировать размер стека?
Спасибо!