WCF和ASP.NET会话共享

时间:2011-10-16 12:02:45

标签: asp.net ajax wcf client-server

以下是我的案例,我正在研究可扩展应用程序的基础架构。 我正在创建一个简单的ASP.NET客户端页面,它使用带有AJAX调用的WCF服务(简单的xmlhttp对象而不是.net脚本管理器)。 我需要2来共享会话,所以我已经指示ASP.NET客户端应用程序使用aspnet_regsql.exe工具在SQL中存储会话。

我已检查过WCF服务是否正在接收与ASP.NET客户端生成的会话ID相同的会话ID,但在服务中,会话密钥容器为空。

我的印象是它可能与配置中的应用名称有关,但我真的不知道......

任何方向?

2 个答案:

答案 0 :(得分:3)

如果必须与WCF服务共享ASP.NET会话,则需要在MSDN上查看WCF Services and ASP.NET以了解如何启用WCF ASP.NET兼容模式。

大多数情况下,归结为:

 <system.serviceModel>        
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />    
 </system.serviceModel>

在WCF服务的服务端配置中。此外,您必须确保您的WCF服务实现没有明确拒绝ASP.NET兼容模式。

因此,您的WCF服务类必须允许甚至要求ASP.NET兼容性:

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class YourService : IYourService

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class YourService : IYourService

答案 1 :(得分:3)

我找到了问题的答案。 我需要更改使用“aspnet_regsql.exe”工具创建的SQL ASPState DB中的“TempGetAppID”过程来获取APP_NAME()而不是传递的参数。 这确保了所有应用程序现在共享同一会话。 一旦我做了更改,WCF服务就开始意识到在我的asp.net应用程序中插入的会话。 问题解决了。

ALTER PROCEDURE [dbo].[TempGetAppID]
@appName    tAppName,
@appId      int OUTPUT
AS
SET @appName = APP_NAME()
SET @appId = NULL

SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName