【问题标题】:IIS StackOverflow exceptionIIS StackOverflow 异常
【发布时间】:2012-06-21 23:52:36
【问题描述】:

这是同一问题的另一种变体,在 IIS 下运行时,堆栈大小为 256K,导致 StackOverflow 异常发生。这个问题不是什么新鲜事,已经被问过好几次了(herehere

我的问题有点不同。当客户端请求数据并且在 IIS 7 下运行的 WCF 服务尝试序列化相当大的对象图时,将引发异常。它实际上发生在序列化过程中

通过在堆栈大小有限的线程中运行检索/序列化例程,我可以轻松地在开发环境中重现该问题:

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

这模拟了 StackOverflow 异常,就像在 IIS 中一样。当我将传递给 Thread 的构造函数的 stackSize 参数更改为 1MB 时,它工作正常...

我的问题是如何在 WCF 服务方法中做到这一点?换句话说,在我的 WCF 服务方法中,我没有显式创建序列化程序并调用 WriteObject。我如何/在哪里可以在可以控制 stackSize 的线程中做同样的工作?

谢谢!

【问题讨论】:

    标签: c# wcf iis stack-overflow


    【解决方案1】:

    您可以通过更改可执行文件的 PE 标头来修改默认堆栈大小。使用带有 /stack 参数的 editbin.exe。见http://msdn.microsoft.com/en-us/library/35yc2tc3(v=vs.80).aspx

    【讨论】:

    • 感谢您的快速回复,但我宁愿用代码解决这个问题。我尝试使用 /stack 开关进行 editbin.exe,但由于 w3wp 应用程序位于 system32 文件夹中,因此遇到了权限问题。我无法更新文件。此外,如果他们要在 IIS 上安装补丁或更新,我们的更改将被覆盖。关于如何以编程方式解决它的任何想法?
    • @JohnRussell:我的印象是您无法修改线程的创建。如果是这种情况,我知道的唯一选择是修改图像。也许您会进行自我托管并修改该二进制文件而不是 IIS。
    • 我可能能够修改线程的创建,但我只是不确定在 IIS 托管的进程中如何或在何处完成。没有创建序列化程序并调用 WriteObject() 的显式语句。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2012-08-30
    相关资源
    最近更新 更多