ASP.NET 中的 REST WCF 服务和会话

Posted

技术标签:

【中文标题】ASP.NET 中的 REST WCF 服务和会话【英文标题】:REST WCF service and Session‏ in ASP.NET 【发布时间】:2011-05-31 13:27:01 【问题描述】:

如果可以的话,请帮忙。

我一直在尝试从 WCF REST 服务中访问 asp.net 应用程序的当前会话对象。

根本没有成功。从服务访问的会话对象与 aspx 页面中的会话对象不同。

所以,这是我的问题:是否可以通过 HttpContext.Current.Session 访问 REST WCF 服务中的当前会话?

代码有以下几点:

 [AspNetCompatibilityRequirements
(RequirementsMode = 
AspNetCompatibilityRequirementsMode.Allowed)] // I have also tried Required
public class DataService : IDataService

在 web.config 中:

<system.serviceModel>
  <behaviors>
   <endpointBehaviors>
    <behavior name="ClosedRoom.DataServiceBehavior">
     <enableWebScript />
    </behavior>
   </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" >
  <baseAddressPrefixFilters>
        <add prefix="http://localhost:63399"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

  <services>
    <service name="ClosedRoom.DataService">
      <endpoint address="" behaviorConfiguration="ClosedRoom.DataServiceBehavior"
        binding="webHttpBinding" contract="ClosedRoom.IDataService" />
    </service>
  </services>
</system.serviceModel>

谢谢,

【问题讨论】:

WCF 和 ASP.NET 是两种完全不同的技术。请澄清你的问题。它不清楚你试图完成什么。 ASP.NET 会话独立于您可能在(ASP.NET Web?)应用程序中托管的任何 WCF 服务会话。 尝试从blogs.msdn.com/b/wenlong/archive/2010/02/21/… 下载示例应用程序并尝试找出您缺少什么。 您是从应用程序还是从浏览器调用服务?您是否尝试检查传输的 cookie? ASP.NET 中的会话由 cookie 标识。如果 cookie 未随服务请求一起传输,则创建新会话。顺便提一句。 REST 服务应该是无状态的 = 没有任何会话。 对于 ashx,您需要“实施”IReadOnlySessionState,也许这也有帮助? 【参考方案1】:

要重新隐藏会话,您需要提供密钥。在普通的 asp.net 应用程序中,密钥由用户通过 cookie 或 url 参数提供。

您打算如何从 REST 客户端获取该密钥?这些客户端在身份验证后最初是如何获得该密钥的?他们将密钥存储在哪里?

这就是为什么大多数基于 REST 的服务都需要一个 api 访问密钥以及另一个密钥来签署每个请求。

恕我直言,会话与基于 REST 的设计无关。

【讨论】:

我同意这篇文章的观点。我认为 OP 需要在他的架构中添加另一个元素。 @user6130:感谢您的回答。就像对我的一个问题一样:我想在 cookie 中添加用户 ID(我在登录时设置了 5 分钟的滑动到期)并使用它来签署我的请求并检查服务器端是否该用户 ID 可以访问数据他试图请求。这会被认为是好的做法吗?谢谢! :)【参考方案2】:

我知道很久以前就有人问过这个问题,但这可以通过在 asp.net 应用程序中托管 wcf restful 服务来实现,然后在您的服务类顶部添加以下属性:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

这可以实现许多功能,包括:

HttpContext:在 ASP.NET 兼容模式下运行的 WCF 服务可以访问 Current 及其关联状态。

更多信息请看这里:What does AspNetCompatibilityRequirements really mean?

【讨论】:

以上是关于ASP.NET 中的 REST WCF 服务和会话的主要内容,如果未能解决你的问题,请参考以下文章

WCF 会话 ASP.NET 托管问题

如何使用 .Net 4.0 REST WCF 服务?

ASP.NET 中的 WCF 模拟异常

将 REST 方法添加到 WCF 数据服务?

从 ASP.NET 应用程序验证 WCF 服务

在 WCF REST 服务中调用 WebGet 时出错