【问题标题】:Design of a web application with ServiceStack使用 ServiceStack 设计 Web 应用程序
【发布时间】:2013-02-19 04:26:38
【问题描述】:

在获得有关在我的 asp.net MVC 网站上使用 ServiceStack 的建议后 (Maintaining state in Asp.Net MVC website),我开始在我的项目中实现它——但有些东西对我来说仍然不清楚。

目前我有两个项目:一个是 asp.net MVC 项目,另一个是 BL 项目(一个包含所有业务逻辑的类库)。 MVC 项目中的所有控制器都会调用 BL 项目中的类/函数。
目前,mvc项目加载BL的DLL,但将来网站发展壮大时,BL的项目将运行在不同的机器上。

我想使用 ServiceStack 进行会话管理/缓存和身份验证(它们通常相互依赖)。

我的问题:
1) 如果没有基于消息的 Web 服务功能,是否可以仅使用这两个功能? ServiceStack 需要初始化,并且在初始化两次(在两个项目中)时会引发错误。
2)是否可以在两个项目之间拆分ServiceStack的实现?我想在 BL 项目中使用 ServiceStack 的身份验证提供程序来维护身份验证过程,但在 mvc 项目中由我自己(或在 ServiceStack 的帮助下)处理所有 UI/cookie。
3)我想在BL项目中使用ServiceStack的缓存,但是我想我还是需要维护一些会话cookie来接收会话id。正确的方法是什么?为此目的是否有任何内置的辅助函数?

提前致谢!

【问题讨论】:

    标签: asp.net-mvc servicestack n-tier-architecture


    【解决方案1】:

    1) 是否可以仅使用这两个功能而不使用基于消息的 Web 服务功能? ServiceStack 需要初始化,并且在初始化两次时(在两个项目中)都会引发错误。

    如果您安装最新的ServiceStack.Mvc NuGet 包,您将获得基本的ServiceStackController,它是一个 MVC 控制器,可方便地访问 ServiceStack 的内置提供程序。尽管您仍然需要使用所需的依赖项自动连接控制器,例如一个注入的ICacheClient

    尽管您不使用 ServiceStack 的 WebFramework,但拥有一个 AppHost 是注册您的依赖项的一个方便的地方。 ServiceStack 是由ASP.NET's IHttpHandler mappings specified in the Web.config 触发的,所以如果你没有任何指定的映射,ServiceStack 永远不能被外部调用,但注册的依赖仍然可以在内部被访问:

    var cache = AppHost.Resolve<ICacheClient>(); //Get ICacheClient for SS IOC
    

    2) 是否可以在两个项目之间拆分ServiceStack的实现?

    如果你有一个 AppHost,你不能在一个宿主项目中拥有多个实例(根据设计),因为 AppHost 应该类似于一个宿主项目,你的所有服务依赖项都应该在其中注册以及适用于整个 Web 应用程序或服务的配置设置。

    但是,您可以将服务的实现拆分到多个程序集中,并通过在 AppHostBase 构造函数中指定它们让 ServiceStack 扫描它们,例如:

    public class AppHost : AppHostBase 
    {
       public AppHost() : base("My Service", 
         typeof(AServiceInDll1).Assembly, typeof(AServiceInDll2).Assembly/*, etc.*/){}
    }
    

    2) 续。我想在 BL 项目中使用 ServiceStack 的身份验证提供程序来维护身份验证过程,但在 mvc 项目中由我自己(或在 ServiceStack 的帮助下)处理所有 UI/cookie。

    查看ServiceStack.UseCases CustomAuthenticationMvc 示例项目,了解使用 MVC 但使用 ServiceStack 进行身份验证的示例。

    3)我想在BL项目中使用ServiceStack的缓存,但我想我仍然需要维护一些会话cookie来接收会话id。正确的方法是什么?有没有为此目的的内置辅助函数?

    您可以像使用任何其他 C# 类一样使用任何 ServiceStack's Caching providers,即将您的业务逻辑绑定到 ICacheClient 并将具体实现注入您的 IOC。

    对于会话,您可以使用 ServiceStack.Mvc ServiceStackController 中的 base.SessionAs&lt;T&gt; 方法来访问会话。要保存会话,您可以使用 IHttpRequest.SaveSession() 扩展方法。尽管这两种方法都需要 ASP.NET 上下文(如果未提供,它使用 ASP.NET 的 HttpContext 单例)才能工作,因为它依赖于 ServiceStack 的 ss-id/ss-pid cookie,这些cookie 会自动指示添加到客户端(由服务器),只要您访问会话。

    如果您不希望您的业务逻辑服务依赖于 ASP.NET 的 System.Web,我建议您访问并保存要在您的控制器中完成并传递给您的业务逻辑的会话。

    我建议阅读Sessions Wiki Page,了解有关 ServiceStack 会话如何工作的更多背景信息。

    ServiceStack 与 ASP.NET 或 MVC 之间的 ASP.NET Context 集成

    我将添加此信息,因为它对于在 ServiceStack 和 ASP.NET 或 MVC 之间进行高级集成的任何人都很有用,因为 ServiceStack 的一些扩展方法依赖于这些内置类型。

    您可以使用以下命令创建 ServiceStack IHttpRequest 或 IHttpResponse(在任何 HTTP/Controller 请求中):

    var ssHttpRequest = System.Web.HttpContext.Current.Request.ToRequest();
    var ssHttpResponse = System.Web.HttpContext.Current.Response.ToResponse(); 
    

    最后你可以创建一个完整的请求上下文(封装了 IHttpRequest 和 IHttpResponse):

    var ssRequestContext = System.Web.HttpContext.Current.ToRequestContext();
    

    【讨论】:

    • 是否有任何使用 ServiceControllerBase 或 ToRequest 扩展方法的示例 MVC 项目?我发现的唯一一个是 SocialBootstrapApi,但它不使用会话。
    • 任何使用身份验证的东西,例如bootstrapapi.apphb.com 根据定义也使用会话。这是一个example in SocialBootstrapApi,已访问here in the Index.cshtml Razor View
    • 在 SocialBootstrapApi 上,会话会自动保存。是因为身份验证功能吗?在新建MVC项目并添加ServiceStack框架+缓存时,base.UserSession对象始终为null。
    • ServiceStack 非常适合在服务场景中使用,但在 MVC 中它并不简单,并且由于缺乏示例/文档,我发现自己正在研究该框架。如果你能指出一个完整的例子,那就太好了。谢谢!
    【解决方案2】:

    不确定我是否完全理解您的问题以及您希望如何将项目拆分到多个服务器上。我会尽力回答你的问题...

    是否可以只使用这两个功能而不使用基于消息的 Web 服务的功能? ServiceStack需要初始化,初始化两次就报错

    您似乎正试图在一个解决方案中运行 2 个 ServiceStack 实例(甚至可能是 2 个网站)(一个在您的 Web 项目中,一个在您的 BL 层中)。我不认为这是可能的。您的 BL 层可以共享 ServiceStack 库,并且您可以配置(在 AppHost.Configure 方法中)您的 Web 项目中引用您的 BL 项目的那些。

    是否可以在两个项目之间拆分 ServiceStack 的实现?

    我认为答案是肯定的,但是两个项目都使用一个 ServiceStack 实例。这将在项目之间共享会话状态。可能有一种方法可以让两个项目拥有自己的 ServiceStack 实例...请参阅https://github.com/ServiceStack/ServiceStack/wiki/Self-hosting

    我想在 BL 项目中使用 ServiceStack 的缓存,但我想我仍然需要维护一些会话 cookie 来接收会话 id。 如果两个项目都使用 ServiceStack,您可以访问 UserSession (https://github.com/ServiceStack/ServiceStack/wiki/Sessions) 中的所有会话数据。如果您的 MVC 控制器从 ServiceStackController 继承,您可以使用 SessionFeature.GetSessionId() 来获取会话 ID。在您的 ServiceStack 服务(实现服务的类)中,您可以使用 base.Session 获取会话数据。

    希望这会有所帮助。

    【讨论】:

    • 最后,我决定只使用 ormlite 和缓存,不使用服务框架。我将使用 websecurity 的 cookie 来获取会话标识符。谢谢你的回答!
    • 我在学习 ServiceStack 的过程中最喜欢的事情之一是被介绍到它的所有单独有用的库(ServiceStack.OrmLite、ServiceStack.Redis、ServiceStack.Caching 等)中。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2018-09-13
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多