HttpContextAccessor.HttpContext 在块和@sections 中为空
HttpContextAccessor.HttpContext is null in blocks and in @sections
我正在从 episerver 11 迁移到 12,在视图中有这个问题:
在@Html.PropertyFor 上的所有块和@section 中总是得到这个异常:
Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer[2]
Connection ID "17293822592188153887", Request ID "80000020-0005-f000-b63f-84710c7967bb": An unhandled exception was thrown by the application.
System.NullReferenceException: Object reference not set to an instance of an object.
at EPiServer.Web.HttpContextExtensions.ContentRenderingContext(HttpContext httpContext)
at EPiServer.Web.Mvc.Html.Internal.DeferredHtmlContent..ctor(Action`1 action, HttpContext httpContext)
at EPiServer.Web.Mvc.Html.PropertyRenderer.GetHtmlForDefaultMode[TModel,TValue](String propertyName, String templateName, String elementName, String elementCssClass, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyRenderer.PropertyFor[TModel,TValue](IHtmlHelper`1 html, String viewModelPropertyName, Object additionalViewData, Object editorSettings, Expression`1 expression, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyExtensions.PropertyFor[TModel,TValue](IHtmlHelper`1 html, Expression`1 expression)
at AspNetCore.Areas_Main_Views_Shared_Layouts__BaseHtmlBlock.ExecuteAsync() in *MY VIEW NAME*
我调试了反编译代码,在ContentRenderingContext中HttpContextAccessor存在,但是里面的HttpContext为null。
当我尝试在块控制器中注入 IHttpContextAccessor 时,它的 HttpContext 为空。
但是 - 如果我尝试在页面控制器和页面视图中获取它 (@Html.PropertyFor) 它工作正常并且 HttpContext 存在。
在Startup.cs中我是这样应用的:
services.AddHttpContextAccessor();
怎么了?我还需要做其他事情吗?
编辑:
如果我这样做,错误就会解决,但这看起来不太好,我不想到处复制粘贴它。
部分:
@section Footer {
@{
ServiceLocator.Current.GetInstance<IHttpContextAccessor>().HttpContext = Context;
}
@Html.PropertyFor(x => x.CurrentPage.FooterBottomContentArea)
}
对于块(在 InvokeComponent 中注入 HttpContextAccessor 之后):
HttpContextAccessor.HttpContext = HttpContext;
我们发现这个问题在较新版本的 episerver 中得到解决,我们从 12.3 更新到 12.6,PropertyFor 现在到处都可以工作。
我反编译了它,我看到在 GetHtmlForDefaultMode 中它在最新版本中使用 WrappedHtmlContent 而根本不使用 HttpContextAccessor。
我正在从 episerver 11 迁移到 12,在视图中有这个问题:
在@Html.PropertyFor 上的所有块和@section 中总是得到这个异常:
Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer[2]
Connection ID "17293822592188153887", Request ID "80000020-0005-f000-b63f-84710c7967bb": An unhandled exception was thrown by the application.
System.NullReferenceException: Object reference not set to an instance of an object.
at EPiServer.Web.HttpContextExtensions.ContentRenderingContext(HttpContext httpContext)
at EPiServer.Web.Mvc.Html.Internal.DeferredHtmlContent..ctor(Action`1 action, HttpContext httpContext)
at EPiServer.Web.Mvc.Html.PropertyRenderer.GetHtmlForDefaultMode[TModel,TValue](String propertyName, String templateName, String elementName, String elementCssClass, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyRenderer.PropertyFor[TModel,TValue](IHtmlHelper`1 html, String viewModelPropertyName, Object additionalViewData, Object editorSettings, Expression`1 expression, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyExtensions.PropertyFor[TModel,TValue](IHtmlHelper`1 html, Expression`1 expression)
at AspNetCore.Areas_Main_Views_Shared_Layouts__BaseHtmlBlock.ExecuteAsync() in *MY VIEW NAME*
我调试了反编译代码,在ContentRenderingContext中HttpContextAccessor存在,但是里面的HttpContext为null。
当我尝试在块控制器中注入 IHttpContextAccessor 时,它的 HttpContext 为空。
但是 - 如果我尝试在页面控制器和页面视图中获取它 (@Html.PropertyFor) 它工作正常并且 HttpContext 存在。
在Startup.cs中我是这样应用的:
services.AddHttpContextAccessor();
怎么了?我还需要做其他事情吗?
编辑: 如果我这样做,错误就会解决,但这看起来不太好,我不想到处复制粘贴它。
部分:
@section Footer {
@{
ServiceLocator.Current.GetInstance<IHttpContextAccessor>().HttpContext = Context;
}
@Html.PropertyFor(x => x.CurrentPage.FooterBottomContentArea)
}
对于块(在 InvokeComponent 中注入 HttpContextAccessor 之后):
HttpContextAccessor.HttpContext = HttpContext;
我们发现这个问题在较新版本的 episerver 中得到解决,我们从 12.3 更新到 12.6,PropertyFor 现在到处都可以工作。
我反编译了它,我看到在 GetHtmlForDefaultMode 中它在最新版本中使用 WrappedHtmlContent 而根本不使用 HttpContextAccessor。