同一个应用中的服务看不到同一个会话

时间:2017-03-23 18:15:15

标签: c# asp.net web-services wcf session

我有一个包含两个项目的解决方案。一个项目包含许多WCF服务,用于处理我的应用程序的数据访问层 - 处理构建数据的服务,另一个用于房间数据的服务,另一个用于用户数据的服务等。另一个项目是消耗这些服务的实际应用程序。当我将这两个项目部署到服务器时,我将它们作为两个单独的应用程序部署在同一站点下的单独文件夹中。

当用户登录到应用程序时,我设置了一个会话变量,其中包含有关用户的信息(他们自己"他们的房间,建筑物和日历)。因此,我的应用程序中的任何页面都可以看到该信息。

我的问题是我的服务无法看到该会话变量。我已经阅读了许多SO答案,并且我认为由于我将我的服务作为单独的应用程序,他们使用不同的会话,所以我不能指望他们看到该会话变量。我还认为我必须使用ASP.NET兼容模式来使服务维护会话,因此我使用相关属性绘制了我的服务类

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

并确保我的配置已启用此模式

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

在我的用户数据服务中,我添加了一个方法,以便前端应用程序可以将登录用户的此用户信息传递给服务,以及存储该服务的静态属性会话变量中的信息。

    public void SetCurrentUser(User thisUser) {
        CurrentUser = thisUser;
    }

    public static User CurrentUser
    {
        get
        {
            return (User) HttpContext.Current.Session["CurrentUser"];
        }
        set
        {
            HttpContext.Current.Session["CurrentUser"] = value;
        }
    }

当用户登录时,前端应用程序将相关信息存储在自己的会话变量中,并调用此方法告诉用户数据服务将其存储在会话变量中(从我无法让用户服务从前端应用程序中查看会话变量。从用户服务中,我可以整天看到该属性。在从前端应用程序到用户数据服务的多个请求中,服务似乎保持相同的会话,保留该信息。

我的问题是,当我尝试从数据服务应用程序/项目中的任何其他服务访问它时,我得到zilch,nada或更正确 - null。在我的建筑数据服务中,作为测试,我提出了一个简单的陈述

Room[] CurrentUserOwnedRooms = User.CurrentUser.OwnedRooms;

但它失败了,因为CurrentUser为null。它的行为好像建筑数据服务有一个单独的会话,根本没有设置会话变量。当我在建筑数据服务中停止执行并检查HttpContext.Current.Session的内容时,它什么都没有。虽然用户数据服务,每当我调用它时,继续显示在其中设置的一个会话变量。即使两个服务都在同一个应用程序/项目中,也是如此。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

你看过这篇文章吗?

Sharing sessions across applications using the ASP.NET Session State Service

您可以在数据库级别跨应用程序共享会话状态。

还有一篇好文章here概述了如何将MySQL用作会话状态提供者

答案 1 :(得分:2)

ASP.NET支持可自定义的Session State Providers并提供3个标准的:

  • InProcSessionStateStore ,它将会话状态存储在内存中 ASP.NET工作进程
  • OutOfProcSessionStateStore ,存储 在外部状态服务器进程的内存中的会话状态
  • SqlSessionStateStore ,用于在Microsoft SQL中存储会话状态 服务器和Microsoft SQL Server Express数据库

虽然您可以推出自己的自定义产品,但这可能并非易事。保证与多个并发用户(应用程序或服务器)正常工作的3个中唯一一个是SqlSessionStateStore。幸运的是,它支持免费的Microsoft SQL Server Express Edition,但有一些限制,但这些与仅存储小型Web应用程序的会话无关。

该存储最初仍打算与Web场中的不同服务器一起使用,而不是在不同应用程序之间共享会话,因此需要额外的欺骗以使其支持应用程序之间的会话共享。作弊在toddca MSDN blog中描述,主要涉及将TempGetAppID存储过程更改为始终为不同的应用程序名称返回相同的appId,从而启用共享。

您可能也对MSDN如何Share Authentication Tickets Across Applications

的建议感兴趣