Выполнение нескольких веб-страниц (Razor) параллельно - PullRequest
2 голосов
/ 16 марта 2012

Я загружаю и выполняю мои .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

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

HttpContext и другие встроенные объекты ASP.NET, как правило, не ориентированы на многопотоковое выполнение. Если ваша цель состоит в том, чтобы просто использовать шаблонизатор Razor для параллельной обработки нескольких вещей, я думаю, вы можете сделать это, поскольку Razor не имеет прямой зависимости ни от чего в ASP.NET. Но как только вы задействуете .cshtml (System.Web.WebPages), вы, к сожалению, ограничены внутренними свойствами ASP.NET на этом этапе.

1 голос
/ 30 августа 2012

Просто для кого-то, кто видит эту тему.Я сделал минимальную реализацию абстрактных классов HttpContextBase и HttpRequestBase.Затем я передаю новые экземпляры этих классов вместо реальных, когда хочу отобразить viewPage.(Причина, по которой я не использовал шаблонизацию, заключается в том, что я еще не нашел потокобезопасный, кто-нибудь советует?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...