C# 同一应用程序中的服务看不到相同的会话

C# 同一应用程序中的服务看不到相同的会话,c#,asp.net,web-services,wcf,session,C#,Asp.net,Web Services,Wcf,Session,我有一个包含两个项目的解决方案。一个项目拥有许多WCF服务,这些服务处理我的应用程序的数据访问层—一个用于处理建筑数据的服务,另一个用于房间数据,另一个用于用户数据等。另一个项目是使用这些服务的实际应用程序。当我将这两个项目部署到服务器时,我将它们作为两个独立的应用程序部署在同一站点下的不同文件夹中。 当用户登录到应用程序时,我设置了一个会话变量,其中包含有关用户的信息(他们“拥有”的房间,以及最喜欢的房间、建筑物和日历)。因此,我的应用程序中的任何页面都可以看到这些信息。 我的问题是,我的服务

我有一个包含两个项目的解决方案。一个项目拥有许多WCF服务,这些服务处理我的应用程序的数据访问层—一个用于处理建筑数据的服务,另一个用于房间数据,另一个用于用户数据等。另一个项目是使用这些服务的实际应用程序。当我将这两个项目部署到服务器时,我将它们作为两个独立的应用程序部署在同一站点下的不同文件夹中。 当用户登录到应用程序时,我设置了一个会话变量,其中包含有关用户的信息(他们“拥有”的房间,以及最喜欢的房间、建筑物和日历)。因此,我的应用程序中的任何页面都可以看到这些信息。 我的问题是,我的服务无法看到该会话变量。我已经阅读了许多SO的答案,我认为我的服务作为一个单独的应用程序,它们使用不同的会话,因此我不能期望它们看到该会话变量。我还收集到我必须使用ASP.NET兼容模式使服务维护会话,因此我使用相关属性绘制了我的服务类

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
并确保我的配置已启用此模式

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
当用户登录时,前端应用程序将相关信息存储在其自己的会话变量中,并调用此方法告知用户数据服务将其存储在其会话变量中(因为我无法让用户服务从前端应用程序查看会话变量)。从用户服务中,我可以整天看到该属性。在从前端应用程序到用户数据服务的多个请求中,该服务似乎保持相同的会话,并保留该信息。 我的问题是,当我试图从data services应用程序/项目中的任何其他服务访问该服务时,我得到了zilch、nada或更正确的值-null。在我的建筑物数据服务中,作为测试,我放了一个简单的语句

Room[] CurrentUserOwnedRooms = User.CurrentUser.OwnedRooms;
但是它失败了,因为CurrentUser为null。它的行为就好像建筑数据服务有一个单独的会话,而该会话根本没有设置会话变量。当我停止在building data服务中执行并检查HttpContext.Current.Session的内容时,它什么都没有。而无论何时调用用户数据服务,它都会继续显示其中设置的一个会话变量。即使两个服务都在同一个应用程序/项目中,也会发生这种情况。
我遗漏了什么?

你看过这篇文章吗

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


还有一篇很好的文章概述了如何使用MySQL作为会话状态提供程序。ASP.NET支持可自定义的,并提供了3个标准提供程序:

  • InProcSessionStateStore,它将会话状态存储在 ASP.NET工作进程
  • OutofProcessionStateStore,其中存储 外部状态服务器进程中内存中的会话状态
  • SqlSessionStateStore,它在Microsoft SQL中存储会话状态 服务器和Microsoft SQL Server Express数据库
尽管您可以推出自己的定制产品,但这可能不是小事。在这三种类型中,只有
SqlSessionStateStore
可以保证与多个并发用户(应用程序或服务器)正常工作。幸运的是,它支持Microsoft SQL Server Express Edition,该版本是免费的,但有一些限制,但这些限制不应仅用于存储小型Web应用程序的会话

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


您可能还对MSDN关于如何

“如果您能帮我解决它”的建议感兴趣,这意味着无论您是解决它,还是给我一些帮助我解决它的想法,我都很乐意奖励奖金。是1)前端web应用程序还是2)调用服务的用户浏览器?还有很多ASP.NET会话状态提供程序,所以如果你不想使用MSSQL,你就不会被MSSQL困住。我看过那篇文章。根据项目要求,我将MySql用于我的数据库。我不知道如何实现SQL会话提供程序。我会研究它-任何指点都会非常感激。我已经更新了我的答案,包括如何使用MySQL作为会话状态提供程序的参考。我非常喜欢在框架内使用工具(不太可能出现不可预测的行为),这就是为什么我不太乐意使用MySQL做任何事情。最后,我只是将用户信息传递给需要它们的服务方法。它为每个服务调用都添加了一个额外的参数,但与尝试使用非ASP.NET会话状态提供程序相比,我对结果更有信心。不过,我真的很感谢你的努力,我怀疑还有更好的答案,所以你得到了赏金。谢谢你。我需要进一步研究身份验证票据的共享。你的回答,特别是最后一个链接,帮助我更好地了解了一些背景情况,我希望我能把赏金分成几块,这样我就可以给你的回答一些。再次感谢你帮我解决这个问题。
Room[] CurrentUserOwnedRooms = User.CurrentUser.OwnedRooms;