gpt4 book ai didi

asp.net - 如何在 ServiceStack 服务实现中使用标准的 ASP.NET session 对象

转载 作者:行者123 更新时间:2023-12-03 14:30:44 28 4
gpt4 key购买 nike

我刚刚开始使用 ServiceStack,作为一个测试用例,我希望重新设计一个使用标准 ASP.Net 处理程序构建的现有服务。我已经设法让它按照我的意愿工作,但在某些方面使用了 ASP.Net Session 对象。

我尝试将 IRequiresSessionState 添加到服务接口(interface)中:

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 替换它,或者尝试删除任何服务器端 session 要求,但我认为我暂时会使用 ASP.Net 实现,以使事情正常工作并避免对其进行更多的返工这个时候是有必要的。

最佳答案

使用 ServiceStack ISession

ServiceStack 有一个新的 ISessionICacheClient 支持的接口(interface)让您共享相同的 ISession MVC Controller 、ASP.NET 基页和 ServiceStack 的 Web 服务之间共享相同的 Cookie Id,允许您在这些 Web 框架之间自由共享数据。

注意:ISession 是 干净的实现 ServiceStack's MVC PowerPack 中所述,使用 ServiceStack 自己的组件完全绕过现有的 ASP.NET session 。并在 Sessions wiki page 中有详细解释.

为了轻松使用 ServiceStack 的 session (缓存和 JSON 序列化程序),您的 Controller 继承自 ServiceStackController (在 MVC 中)或 PageBase (在 ASP.NET 中)

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

  • Authentication and authorization
  • Validation

  • 使用 ASP.NET session

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

    ServiceStack 中的任何内容都不会访问或影响底层 ASP.NET 应用程序中配置的缓存和 session 提供程序。如果你想启用它,你需要在 ASP.NET 中按照正常方式配置它(即在 ServiceStack 之外),请参阅:

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

    配置完成后,您可以通过单例访问 ServiceStack Web 服务中的 ASP.NET session :
    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,而是选择使用清洁器 Cache Clients包含在 ServiceStack 中。

    Sessions 的工作方式(包括 ASP.NET)基本上是一个包含 的 cookie。唯一 ID 添加到唯一标识浏览器 session 的响应中。此 id 指向服务器上表示浏览器 session 的匹配字典/集合。

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

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

    这是 another authentication implementation而是验证所有标有 的服务【认证】属性,和 how to enable Authentication for your service通过在您的请求 DTO 上添加属性。

    ServiceStack 中的新身份验证模型

    上述实现是下一版本 ServiceStack 中包含的多身份验证提供程序模型的一部分。这是 the reference example展示如何在您的应用程序中注册和配置新的 Auth 模型。

    认证策略

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

    以下是我多年来使用的不同身份验证策略:
  • 使用 标记需要身份验证的服务【属性】 .可能是最惯用的 C# 方式,理想的时候 session ID 通过 Cookie 传递。
  • 尤其是在 Web 上下文之外,有时会使用更明确的 IRequiresAuthentication 接口(interface)更好,因为它提供对身份验证所需的 User 和 SessionId 的强类型访问。
  • 您可以只使用 1-liner 来对需要它的每个服务进行身份验证 - 在临时基础上。当您只有很少的服务需要身份验证时,这是一种合适的方法。
  • 关于asp.net - 如何在 ServiceStack 服务实现中使用标准的 ASP.NET session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339584/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com