无法与wcf服务共享ASP.NET会话

时间:2013-06-13 17:59:27

标签: asp.net wcf session session-state sessionid

所以,我有相同的机器asp.net应用程序和wcf服务。我正在尝试在他们之间分享asp.net会话。 我已配置Sql server来存储我的会话数据。 我在ASPdb中有ASPState Db和两个表:ASPStateTempSessions, ASPStateTempApplications 两者都有数据行。 在asp.net app和wcf服务配置中,我添加了:

<sessionState mode="SQLServer" sqlConnectionString="Data Source=localhost;integrated security=True;Application Name=app" />

在Asp.net应用程序中,我设置了这样的用户

HttpContext.Current.Session["User"] = userName;

在日志中,我看到了一个用户实际设置的条目。 (并通过JS检查)

在wcf服务中:

[ServiceContract(SessionMode = SessionMode.Allowed)]
    public interface IDbWebService
    {
        [OperationContract]
        [WebInvoke]
        Data GetBlahBlah(string env);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public partial class WebService : IDbWebService
    {
          public  Data GetBlahBlah(string env)
          {
                 //trying to get data here, nothing, just null
                _log.InfoFormat("USER: {0}", HttpContext.Current.Session["User"]); 

          }
}

但我无法获得Session [“User”]。

我做错了,也许我错过了一些明显的东西?

提前致谢!

1 个答案:

答案 0 :(得分:0)

见这篇文章:

Losing Session State with ASP.NET/SQL Server

确保您的应用程序ID在IIS管理器中是相同的,并且您在两个配置中都设置了相同的机器密钥。两者都用于会话状态的生成和加密,因此如果它们不同,您将无法共享会话条目。

另外,依靠会话状态在应用程序和Web服务之间传递信息似乎违反了分层的责任模式。您的Web服务现在依赖客户端通过此后门提供数据,这意味着服务合同中的任何位置都没有表示。消费该服务的另一个客户端必须以相同的方式提供数据,以使服务正常运行。是否有理由不能在方法签名中提供数据?