イム・ロードまでにいくつかのWebページ(レイザー)を実行し、(私の世界では)、各.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ファイルを1つずつ実行すると、例外がトリガーされません。それは、ウェブページの一部の内部の仕組みがExecutePageHierarchy
への各呼び出しは何とか現在のHttpContext
一部はTemplateStackがHttpContext.Itemsに静的キーで保存されていることがあることを明らかにした掘削しますこの例外がスローされる理由。回避策としては、HttpContextWrapperをサブクラス化してItemsプロパティを分離することができます。これにより、各並列反復に固有のスタックが設定されます。それは働くだろうか? –
@Pauliは動作するかもしれませんが、非常にサポートされていないでしょう。あなたがしていることは、ASP.NETの内部構造を掘り下げ、動作方法を若干変更することです。その結果は予測できず、システムに対するわずかなパッチ/変更/アップグレードで非常にうまく機能しなくなります。したがって、私はこのアプローチをお勧めしません。 CSHTMLページは、同じリクエスト内で並行して実行されることを意味していません。 – Eilon