以下是我的案例,我正在研究可扩展应用程序的基础架构。 我正在创建一个简单的ASP.NET客户端页面,它使用带有AJAX调用的WCF服务(简单的xmlhttp对象而不是.net脚本管理器)。 我需要2来共享会话,所以我已经指示ASP.NET客户端应用程序使用aspnet_regsql.exe工具在SQL中存储会话。
我已检查过WCF服务是否正在接收与ASP.NET客户端生成的会话ID相同的会话ID,但在服务中,会话密钥容器为空。
我的印象是它可能与配置中的应用名称有关,但我真的不知道......
任何方向?
答案 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