Исключение IIS StackOverflow

Это еще один вариант того же вопроса, когда возникает исключение 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. Как/где я могу сделать такую ​​же работу в потоке, где я могу контролировать размер стека?

Спасибо!

7
задан Community 23 May 2017 в 11:56
поделиться