【问题标题】:WCF AND ASP.NET session sharingWCF 和 ASP.NET 会话共享
【发布时间】:2011-10-16 12:02:44
【问题描述】:

这是我的情况,我正在为可扩展的应用程序开发基础架构。 我正在创建一个简单的 ASP.NET 客户端页面,该页面通过 AJAX 调用使用 WCF 服务(简单的 xmlhttp 对象而不是 .net 脚本管理器)。 我需要 2 来共享会话,因此我已指示 ASP.NET 客户端应用程序使用 aspnet_regsql.exe 工具将会话存储在 SQL 中。

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

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

有什么方向吗?

【问题讨论】:

  • WCF 默认情况下与 ASP.NET 会话不“兼容” - 毕竟,WCF 不是 ASP.NET 并且默认情况下没有任何事情可做与 ASP.NET 运行时。 WCF 服务可以(并且通常应该)完全独立于任何 IIS/ASP.NET 位进行托管 - WCF 不属于也不依赖于 ASP.NET ...

标签: asp.net ajax wcf client-server


【解决方案1】:

如果您必须与 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

【讨论】:

  • 很抱歉没有详细说明,但我已将 aspNetCompatibilityEnabled 标志添加到服务配置文件中。我自己找到了问题的根源。请查看我的第二个帖子。
【解决方案2】:

我找到了问题的答案。 我需要更改使用“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

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多