Я загружаю и выполняю мои .cshtml файлы, подобные этому
var webPage = WebPage.CreateInstanceFromVirtualPath(_relativeFilePath);
var httpContext = new HttpContextWrapper(HttpContext.Current);
var startPage = StartPage.GetStartPage(webPage, "_PageStart", new[] { "cshtml" });
var pageContext = new WebPageContext(httpContext, webPage, startPage);
var sb = new StringBuilder();
using (var writer = new StringWriter(sb))
{
webPage.ExecutePageHierarchy(pageContext, writer);
}
string output = sb.ToString().Trim();
Теперь, поскольку (в моем мире) каждый файл .cshtml является автономным модулем, я могу иметь вышеупомянутый код, который выполняется N раз подряд, но в редких случаях он взрывается, за исключением следующего.
System.InvalidOperationException: Stack empty.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Stack`1.Pop()
at System.Web.WebPages.TemplateStack.Pop(HttpContextBase httpContext)
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors)
at System.Web.WebPages.WebPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
Если я отключаю распараллеливание и запускаю все файлы .cshtml по одному, я не могу вызвать исключение. Это заставляет меня задаться вопросом, не являются ли некоторые внутренние операции веб-страниц потокобезопасными, что каждый вызов ExecutePageHierarchy
каким-то образом обращается к некоторому неуникальному значению в текущем HttpContext