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

asp.net-mvc – 使用ServiceStack设计Web应用程序

发布时间:2020-12-16 07:12:20 所属栏目:asp.Net 来源:网络整理
导读:在获得有关在我的asp.net MVC网站上使用ServiceStack的建议之后 ( Maintaining state in Asp.Net MVC website),我开始在我的项目中实现它 – 但有些东西对我来说仍然不清楚. 目前我有两个项目:一个是asp.net MVC项目,另一个是BL项目(一个包含所有业务逻辑的
在获得有关在我的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的实现?我想使用ServiceStack的身份验证提供程序在BL项目中维护身份验证过程,但是我自己(或在ServiceStack的帮助下)在mvc项目中处理所有UI / cookie.

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

提前致谢!

解决方法

1)如果没有基于消息的Web服务的功能,并且在初始化两次时(在两个项目中)都会抛出错误.

如果您安装最新的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应用程序的设置或服务.

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

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

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

查看ServiceStack.UseCases CustomAuthenticationMvc示例项目以获取使用MVC但使用ServiceStack进行身份验证的示例.

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

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

对于会话,您可以使用base.SessionAs< T> ServiceStack.Mvc ServiceStackController中的方法来访问会话.要保存会话,您可以使用IHttpRequest.SaveSession()扩展方法.虽然这两种方法都需要ASP.NET上下文(它使用ASP.NET的HttpContext单例,如果没有提供),因为它依赖于ServiceStack的ss-id / ss-pid cookie,它们被自动指示添加到客户端上(由服务器)每当您访问会话时.

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

我建议阅读Sessions Wiki Page以获取有关ServiceStack会话如何工作的更多背景信息.

在ServiceStack和ASP.NET或MVC之间集成ASP.NET上下文

我将添加此信息,因为它对于在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();

(编辑:李大同)

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

    推荐文章
      热点阅读