DI に StructureMap を使用する Web API プロジェクトがあります。しばらくは正常に動作していますが、空のスタックの結果として InvalidOperationExceptions がスローされる Web API ヘルプ ページ (Microsoft.AspNet.WebApi.HelpPage) で問題が発生しています。
ヘルプ ページを使用して新しい Web API プロジェクトを作成しましたが、StructureMap.WebApi2 パッケージを追加するまで正常に動作しますが、前述の例外は ModelDescriptionLink.cshtml 内でスローされます。
else if (modelDescription is CollectionModelDescription)
{
var collectionDescription = modelDescription as CollectionModelDescription;
var elementDescription = collectionDescription.ElementDescription;
@:Collection of @Html.DisplayFor(m => elementDescription.ModelType, "ModelDescriptionLink", new { modelDescription = elementDescription })
}
else
{
@Html.DisplayFor(m => modelDescription)
}
@:Collection of @Html.DisplayFor(m => elementDescription.ModelType, "ModelDescriptionLink", new { modelDescription = elementDescription })
このモデルのリソース説明へのリンクを表示しようとすると、スローされます。
これは、依然として例外を引き起こすスリム化されたルートです。
[Route("Test")]
public IHttpActionResult Post([FromBody] IEnumerable<MySimpleModel> models)
{
return null;
}
このルートのドキュメントにアクセスしようとするhttp://localhost:21966/Help/Api/POST-Test
と、例外が発生します。
同じ問題を抱えている人の例を1 つだけ見つけることができました。その解決策は、StructureMap から Ninject に切り替えるか、null チェックで例外を回避することでした。
スタック トレースの先頭は次のとおりです。
[InvalidOperationException: Stack empty.]
System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) +52
System.Collections.Generic.Stack`1.Peek() +6693321
System.Web.WebPages.WebPageBase.get_Output() +51
System.Web.WebPages.WebPageBase.GetOutputWriter() +35
System.Web.WebPages.WebPageExecutingBase.BeginContext(String virtualPath, Int32 startPosition, Int32 length, Boolean isLiteral) +50
ASP._Page_Areas_HelpPage_Views_Help_DisplayTemplates_ModelDescriptionLink_cshtml.Execute() in c:...ModelDescriptionLink.cshtml:28
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +271
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +122
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +145
System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +695
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +382
System.Web.Mvc.Html.ActionCacheViewItem.Execute(HtmlHelper html, ViewDataDictionary viewData) +278
HelpPageApiModel.cshtml
この場所で例外をキャッチすることにより、後でほぼ同じ行にポップアップします: @Html.DisplayFor(m => m.ResourceDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ResourceDescription })
. これはそのスタック トレースの先頭です。
[InvalidOperationException: Stack empty.]
System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) +52
System.Collections.Generic.Stack`1.Pop() +6667365
System.Web.WebPages.WebPageBase.PopContext() +66
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +154