所以,我有相同的机器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”]。
我做错了,也许我错过了一些明显的东西?
提前致谢!
答案 0 :(得分:0)
见这篇文章:
Losing Session State with ASP.NET/SQL Server
确保您的应用程序ID在IIS管理器中是相同的,并且您在两个配置中都设置了相同的机器密钥。两者都用于会话状态的生成和加密,因此如果它们不同,您将无法共享会话条目。
另外,依靠会话状态在应用程序和Web服务之间传递信息似乎违反了分层的责任模式。您的Web服务现在依赖客户端通过此后门提供数据,这意味着服务合同中的任何位置都没有表示。消费该服务的另一个客户端必须以相同的方式提供数据,以使服务正常运行。是否有理由不能在方法签名中提供数据?