【问题标题】:Injected HttpContext is always null注入的 HttpContext 始终为空
【发布时间】:2016-02-28 17:13:58
【问题描述】:

这真是令人兴奋,我无法让它发挥作用。 上下文始终为空,无论它被注入到哪里......

我是否必须在 Startup.cs 中添加上下文实例?如果是,如何?

发起呼叫

services.AddTransient<SessionService>();
Toast.Configure(app.ApplicationServices.GetRequiredService<SessionService>());
_session.Set("foo", "bar");

吐司课

public class Toast
{
    private static SessionService _session;
    public static void Configure(SessionService sessionService)
    {
        _session = sessionService;
        Messages = new List<ToastMessage>();
    }
}

会话服务

public class SessionService
{
    private readonly IHttpContextAccessor _accessor;
    public SessionService(IHttpContextAccessor httpContextAccessor)
    {
        _accessor = httpContextAccessor;
    }

    public void Set(string key, string value)
    {
        _accessor.HttpContext.Session.SetString(key, value);
    }
}

例外情况

System.NullReferenceException
Object reference not set to an instance of an object.

System.Reflection.TargetInvocationException
Exception has been thrown by the target of an invocation.

堆栈跟踪

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at EveOps.Services.SessionService.Set(String key, Byte[] value) in C:\Users\youri\Documents\Visual Studio 2015\Projects\EveOps\src\EveOps\Services\SessionService.cs:line 25
   at EveOps.Toast.set_Messages(List`1 value) in C:\Users\youri\Documents\Visual Studio 2015\Projects\EveOps\src\EveOps\Toast\Toast.cs:line 41
   at EveOps.Toast.Configure(SessionService sessionService) in C:\Users\youri\Documents\Visual Studio 2015\Projects\EveOps\src\EveOps\Toast\Toast.cs:line 18
   at EveOps.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) in C:\Users\youri\Documents\Visual Studio 2015\Projects\EveOps\src\EveOps\Startup.cs:line 162
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Microsoft.AspNet.Hosting.Startup.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNet.Hosting.Startup.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder)
   at Microsoft.AspNet.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder builder)
   at Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication()

【问题讨论】:

  • 您是否尝试通过注入解决Toast?您可以发布异常及其 StackTrace 吗?
  • @aguafrommars 没试过,堆栈跟踪在 OP 中编辑。
  • 好的,因为没有HttpContext,在启动时,如果你在启动时调用Set方法,你总是会得到一个空的HttpContext。我只能在请求期间获得上下文。
  • @aguafrommars 我明白了。谢谢你。现在开始工作了:)

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

感谢@aguafrommars 说明了这一点;上下文只对请求有效,尽管我知道这一点,但我对 DI 和服务的理解还不是很好。

我的问题的解决方案(伪):

App.Use() {
   Toast.Configure(app.ApplicationServices.GetRequiredService<SessionService>());
}

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多