How to access HttpContext outside of controllers in ASP.NET MVC?
具体来说,会话变量。我的ASP.NET MVC项目中有一个.ashx,它将一些图像数据拉出来显示给用户,我需要能够访问存储在会话中的对象。从控制器中,我可以很好地提取对象,但在我的ashx页面中,context.session为空。有什么想法吗?谢谢!
下面是我要做的事情的一个例子…context.session始终返回空值。
1 2 3 4 5 6 7 8 9 10 11 12 13 | private byte[] getIconData(string icon) { //returns the icon file HttpContext context = HttpContext.Current; byte[] buffer = null; //get icon data if ( context.Session["tokens"] != null) { //do some stuff to get icon data } } |
必须在代码中导入System.Web程序集,然后才能执行以下操作:
1 2 3 | HttpContext context = HttpContext.Current; return (User)context.Session["User"]; |
编辑:
伙计,我在这里做了一些测试,它对我很有用,试试这样的方法:
创建一个助手类来封装您获取会话变量的内容,它必须导入System.Web程序集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class TextService { public static string Message { get { HttpContext context = HttpContext.Current; return (string)context.Session["msg"]; } set { HttpContext context = HttpContext.Current; context.Session["msg"] = value; } } } |
然后在控制器中,您应该执行如下操作:
1 2 | TextService.Message ="testing the whole thing"; return Redirect("/home/testing.myapp"); |
在您的其他类中,您可以调用helper类:
1 | return TextService.Message; |
试一试。
好吧,我最后不得不做的是……在我的ashx文件中,我添加了IReadonlySessionState接口,它将访问会话状态。所以看起来像这样…
1 | public class getIcon : IHttpHandler, IReadOnlySessionState |
在.NET核心中,访问控制器外部httpContext的最佳方法是使用IHttpContextAccessor。使用DI,我们可以访问用户/httpContext对象,例如httpContextAccessor.httpContext.user和httpContextAccessor.httpContext.httpContext。有关详细答案,请参阅此链接。谢谢!
为了拯救任何人的挖掘,.NET核心2.1+:
在startup.cs中将以下内容添加到public void configureservices(…)中:
1 | services.AddHttpContextAccessor(); |
通过注入您的服务/etc使用:
1 | public MyService(IHttpContextAccessor httpContextAccessor) { //... } |
感谢:https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpContextAccessor-correctly