2016-02-11 77 views
2

这是老实说,我无法让它工作。 上下文始终为空,无论它注入何处...注入HttpContext始终为空

是否必须在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() 
+0

你尝试通过注射来解决吐司?你能发布Exception和它的StackTrace吗? –

+0

@aguafrommars还没有尝试过,在OP中编辑了堆栈跟踪。 – NullBy7e

+5

好吧,这是因为在启动时没有HttpContext,如果你在启动时调用'Set'方法,你总是会得到一个空的'HttpContext'。我只能在请求期间拥有一个上下文。 –

回答

0

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

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

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