【问题标题】:Why can I not read or write session? Throws NullObject Reference为什么我不能读或写会话?引发 NullObject 引用
【发布时间】:2013-02-26 02:47:01
【问题描述】:

我正在制作一个 WebAPI 应用程序,但发现我无法读取或写入会话。我通常会如何给出和 NullObject 引用错误,即:

Session["Test"] = "Testing"; var testing = Session["Test"].ToString();

会有人碰巧理解为什么这个例子是这样的吗?

using System;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.SessionState;
using System.Web.UI.WebControls;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Portals;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Web.Api;

namespace DotNetNuke.Modules.ContactsManager
{

    public partial class ServicesController : DnnApiController
    {
       [AllowAnonymous]
       [HttpGet]
       public HttpResponseMessage createRequest(string amount)
       {
          //code omitted     
          HttpContext.Current.Session["Test"] = "Test";
          //code omitted
          return Request.CreateResponse(HttpStatusCode.OK, result);
       }
    }
 }

【问题讨论】:

  • -1:当你尝试时会发生什么? “我无法读取或写入会话”不是很具有描述性。
  • 所以,您的实际问题是,“为什么 Session["Test"] 在我设置后立即为空?”
  • 因为在取消引用 Session["Test"] 时获得 NullReferenceException 的唯一原因是 Session["Test"] 是否为 null!
  • 您能否根据我的使用情况提供一些建议,说明为什么当我能够在我的应用程序的其他区域(即 view.ascx.cs)中成功使用示例时会出现这种情况
  • 我不知道。您没有发布足够多的代码或告诉我们足够的上下文来确定这一点。另外,当您说“成功”时,您的意思是您能够在所有其他领域做到以下几点吗? Session["Test"] = "Testing"; System.Diagnostics.Debug.Assert(Session["Test"] != null);

标签: c# asp.net session asp.net-web-api


【解决方案1】:

可能是您没有正确添加到会话中。

尝试做类似HttpContext.Current.Session.Add("Test", "Test"); 的事情

您的第二条语句var testing = Session["Test"].ToString(); 将按照您的预期检索数据。

【讨论】:

  • 听起来应该可以,但在我的情况下,我得到了 NullReferenceException,就像我在原始示例中所做的那样。
  • 我的示例中的 read 和 write 语句都会产生相同的 NullReferenceException。问题是我有一个 view.ascx 页面,如果我在 view.ascx.cs 中使用原始示例中的语句,它们可以正常工作。问题是在另一个类(ServicesController.cs)中使用语句
  • 我没有足够的代码来做出足够好的断言,但它似乎没有被放入您的会话中以便在其他地方使用。例如。您的 view.ascx.cs 播放得很好,但是如果您转到 view2 或任何您尚未添加“测试”的地方,它就找不到它,因为它不存在。我可以尝尝你用来重现这个的过程吗?
  • 这两种说法都会导致这种情况? 很高兴告诉我们。我投票结束这个问题。如果你能就你的实际问题提出一个新问题,我会很高兴,这只是写语句不起作用!
【解决方案2】:

我找到了答案,一切都与继承有关。我的解释可能措辞不太好,因为我仍在学习,但就是这样。

我正在使用的类已经继承了一个 ApiController 类,并且在我的 DotNetNuke 项目中,似乎 Session 之类的东西包含在“{NameSpace}ModuleBase”类中。所以实现一个 IDisposable

    using(myPorjectModuleBase base = new myProjectModuleBase())
{
 var testing = Session["Test"].ToString();
}

然后我可以访问会话。

这可能特定于 DotnetNuke 6.2 及更高版本平台上的模块开发。

感谢大家的帮助。

【讨论】:

  • 能否包含 myProjectModuleBase 类的代码?没有它,它并不能真正回答问题。
  • 我有同样的问题,但没有解决方案。请详细发布代码以解释您的解决方案。
【解决方案3】:

您可以使用以下代码,这是 C# 中的示例示例

public static string UserId
    {
        get
        {
            if (HttpContext.Current.Session["UserId"] == null)
            {
                return "";
            }
            return HttpContext.Current.Session["UserId"].ToString();
        }
        set
        {
            HttpContext.Current.Session["UserId"] = value;
        }
    }

【讨论】:

  • 对不起,我没有意识到提供了这个答案。我找到了我的解决方案。我认为它非常适合我的环境。
猜你喜欢
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2011-01-14
  • 2015-09-02
相关资源
最近更新 更多