【问题标题】:I can t use SessionService class in asp.net web api我无法在 asp.net web api 中使用 SessionService 类
【发布时间】:2018-08-25 05:44:35
【问题描述】:

我有一个从 webapi 控制器派生的类。在那个控制器中我有一个方法

    [HttpGet]
    [Route("MessageCount")]
    public string GetMessageCountCount()
    {
        OrganisationMembership organisationMembership = organisationService.Find(organisationId);
        SessionService.Get.SetUserConversationMessages(organisationMembership);

        return SessionService.Get.UnreadMessagesCount.ToString();
    }

这里是会话服务

public class SessionService : ISessionService
{
    private static SessionService _sessionService;
    public static SessionService Get
    {
        get
        {
            if (_sessionService == null)
            {
                _sessionService = new SessionService(new RakletDb());
            }
            return _sessionService;
        }
    }

    public int UnreadMessagesCount
    {
        get { return GetSessionInt("UnreadMessagesCount"); }
        private set { SetSessionValue("UnreadMessagesCount", value); }
    }

    private int GetSessionInt(string key)
    {
        var s = HttpContext.Current.Session[key];
        if (s != null)
        {
            return Int32.Parse(s.ToString());
        }

        return 0;
    }

    private void SetSessionValue(string key, object o)
    {
        HttpContext.Current.Session[key] = o;
    }

    public void SetUserConversationMessages(OrganisationMembership organisationMembership)
    {
        this.UnreadMessagesCount = somelinq query;
    }
}

我的项目成功编译。但是当我从浏览器调用 GetMessageCount 方法时,它给了我这样的错误:

错误

{"Message":"发生错误。","ExceptionMessage":"对象引用未设置为对象的实例。","ExceptionType":"System.NullReferenceException","StackTrace":" at Services.SessionService.SetSessionValue(String key, Object o)...

我在控制器中使用这样的东西:SessionService.UnreadMessageCount 但在 webapi 我只能使用SessionService.Get.UnreadMessageCount 那么有什么问题呢?

【问题讨论】:

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


    【解决方案1】:

    问题出在HttpContext.Current.Session[key] = o;,因为设计的REST web api是无状态的。所以默认你不能使用Session。

    我不建议你在 web api 上使用 session。

    如果你想使用Session,你需要创建一个HttpHandler,它实现了IHttpHandler,并让它实现了System.Web.SessionState.IRequiresSessionState

    你可能会喜欢

    public class SessionHander : 
        System.Web.Http.WebHost.HttpControllerHandler, 
        System.Web.SessionState.IRequiresSessionState
    {
        public SessionHander(RouteData routeData) : base(routeData)
        { }
    }
    
    public class SeesionRouterHanlder : 
        System.Web.Http.WebHost.HttpControllerRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new SessionHander(requestContext.RouteData);
        }
    }
    

    这个代码在Global.asax

    var route = RouteTable.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
    );
    
    route.RouteHandler = new SeesionRouterHanlder(); 
    

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 2019-02-11
      • 2021-04-25
      • 2013-03-20
      • 2018-04-23
      • 1970-01-01
      • 2018-05-09
      • 2014-01-07
      相关资源
      最近更新 更多