加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何在ServiceStack服务实现中使用标准的ASP.NET会话对象

发布时间:2020-12-16 00:30:05 所属栏目:asp.Net 来源:网络整理
导读:我刚刚开始使用ServiceStack,作为测试用例,我正在寻找一种使用标准ASP.Net处理程序构建的现有服务。我已经设法让它一切正常工作,因为我想要它,但有某些方面使用ASP.Net会话对象。 我已经尝试在服务接口中添加IRequiresSessionState: public class Sessi
我刚刚开始使用ServiceStack,作为测试用例,我正在寻找一种使用标准ASP.Net处理程序构建的现有服务。我已经设法让它一切正常工作,因为我想要它,但有某些方面使用ASP.Net会话对象。

我已经尝试在服务接口中添加IRequiresSessionState:

public class SessionTestService : RestServiceBase<SessionTest>,IRequiresSessionState {
    public override object OnPost(SessionTest request) {
        // Here I want to use System.Web.HttpContext.Current.Session
    }
}

麻烦是我似乎无法让它工作,因为Session对象总是为空。

我已经做了很多谷歌搜索,并在https://github.com/mythz/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Services/Secure.cs和困惑相似,但我找不到任何代码这样做(这让我惊讶)。任何人都可以解释为什么上述不起作用,并建议我需要做些什么来使其工作?

注意:最终我可能会将其替换为Redis或者将尝试删除任何服务器端会话要求,但我认为我将暂时使用ASP.Net实现,以使事情发生并避免重做在这一点上超过了必要的。

解决方法

使用ServiceStack ISession

ServiceStack具有由ICacheClient支持的新的ISession接口,可让您在MVC控制器,ASP.NET基础页面和ServiceStack的Web服务之间共享相同的ISession,该服务共享相同的Cookie标识,允许您在这些Web框架之间自由共享数据。

注意:ISession是一个干净的实现,完全绕过ServiceStack自己的组件的现有ASP.NET会话,如ServiceStack’s MVC PowerPack所述,并在Sessions wiki page中详细说明。

为了方便使用ServiceStack的Session(Cache& JSON Serializer),您的Controllers从ServiceStackController(MVC)或PageBase(在ASP.NET中)继承,

在ServiceStack中添加了新的验证/验证功能,您可以在wiki上阅读:

> Authentication and authorization
> Validation

使用ASP.NET会话

本质上ServiceStack只是一套在ASP.NET或HttpListener主机上运行的轻量级IHttpHandler。如果托管在IIS / ASP.NET(最常见),它的工作原理像一个普通的ASP.NET请求。

ServiceStack中没有任何内容访问或影响底层ASP.NET应用程序中配置的缓存和会话提供程序。如果要启用它,您将需要按照ASP.NET中的正常配置(即ServiceStack外),请参阅:

http://msdn.microsoft.com/en-us/library/ms178581.aspx

配置完成后,您可以通过单例访问ServiceStack Web服务中的ASP.NET会话:

HttpContext.Current.Session

或者通过底层的ASP.NET HttpRequest与:

var req = (HttpRequest)base.RequestContext.Get<IHttpRequest>().OriginalRequest;
var session = req.RequestContext.HttpContext.Session;

虽然由于强制依赖于XML配置和degraded performance by default,我更喜欢避免使用ASP.NET的Session,而是选择使用ServiceStack附带的更清洁的Cache Clients。

基本上Sessions的工作方式(包括ASP.NET)是一个包含唯一ID的cookie被添加到Response唯一标识浏览器会话。该id指向服务器上的匹配的Dictionary / Collection,表示浏览器的Session。

您链接到的IRequiresSession接口在默认情况下不执行任何操作,它只是一种向自定义请求过滤器或基本Web服务发出信号的方式,该请求需要进行身份验证(例如,您应该将验证/身份验证逻辑在ServiceStack)。

这是一个Basic Auth implementation,看看Web服务是否安全,如果是,请确保他们已经通过身份验证。

这是another authentication implementation,而是通过在请求DTO上添加属性来验证标有[Authenticate]属性的所有服务,以及how to enable Authentication for your service。

ServiceStack中的新认证模型

上述实现是ServiceStack下一版本中包含的多验证提供者模型的区别。这是the reference example,显示如何在应用程序中注册和配置新的Auth模型。

验证策略

新的Auth模型完全是一种选择性的方便,因为您可以简单地使用它,并使用请求过滤器或基类(通过覆盖OnBeforeExecute)自己实现类似的行为。实际上,新的Auth服务实际上并不内置到ServiceStack中。整个实现方式都在可选的ServiceStack.ServiceInterfaces project中,并使用自定义请求过滤器实现。

以下是我多年来使用的不同身份验证策略:

>使用[Attribute]标记需要身份验证的服务。可能是最惯用的C#方式,当session-id通过Cookie传递时,理想。>特别是在Web上下文之外,有时使用更明确的IRequiresAuthentication接口更好,因为它提供强大类型的访问用户和验证所需的SessionId。>您可以只需一个一线的身份验证每个需要它的服务 – 基于adhoc。一个合适的方法,当你有很少的服务需要身份验证。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读