跨请求检索和保持状态

Hom*_*lli 12 asp.net asp.net-web-api asp.net-web-api2

我正在编写我的第一个ASP.NET Web API应用程序.我熟悉其他Web应用程序框架(主要是Symfony,但也有Django,在较小程度上是RoR).

我正在苦苦挣扎,以了解从浏览器/前端客户端向Web服务器发送请求后发生的事件序列.

我正在编写一个使用数据库后端的多租户应用程序.我使用ADO和原始SQL来访问数据库,我还需要为每个用户存储大量信息,因此基本上,我为用户创建(或从缓存中获取)预加载的上下文.

这里有一些伪代码,它说明了我在ASP.NET中想要实现的目标.

namespace myApp.Controllers
{
    public class FoobarController : ApiController
    {
        public Response doLogin(request)
        {
             var ctx = myApplicationContext.getInstance();
             var user = ctx.getUser();     

             if (!user.isLoggedOn())
             {
                 username = request.getParameter('username');
                 password= request.getParameter('password');

                 dbManager = ctx.getDbInstance();

                 resp = dbManager.internalLogin(username, password);

                 // Load permissions etc for current user, from db
                 // Store user info in cache ..
             }
        }       

        public Response ActionOne(request)
        {
             ctx = myApplicationContext.getInstance();
             user = ctx.getUser();

             if (user.hasPermission('xxx'))
             {

             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我该如何实现这种功能:

即:

  • 创建一个应用程序上下文,我可以在其中填充上下文敏感信息,如数据库连接,邮件程序配置,对象工厂,各种状态信息等.

  • 访问用户对象(我可以添加用户凭据,权限等)

  • 有权访问会话变量等吗?

笔记

  1. 我将在Linux上部署Web应用程序,我将使用Apache作为Web服务器.
  2. 出于本项目的目的,我不想使用任何Microsoft技术,如Azure,Windows身份验证等(C#和ASP.Net除外)
  3. 我想使用原始数据库连接,而不是使用Entity Manager(传统应用程序端口)

Gua*_*nxi 5

我正在苦苦挣扎,以了解从浏览器/前端客户端向Web服务器发送请求后发生的事件序列.

为此,我想说这个PDF海报提供了ASP.NET WebAPI中请求处理的最佳图形表示.

我的问题是,我该如何实现这种功能:

即:

  • 创建一个应用程序上下文,我可以在其中填充上下文敏感信息,如数据库连接,邮件程序配置,对象工厂,各种状态信息等.

  • 访问用户对象(我可以添加用户凭据,权限等)

  • 有权访问会话变量等吗?

为此我要说,WebAPI设计为无状态,因此,最好的方法是创建持久会话(在数据库中说)并为每个请求使用会话标识符(如会话密钥或令牌)来识别用户和获取他的会话变量/上下文信息.

现在,为了实现您在示例中要求的功能,可以通过身份验证过滤器和授权过滤器的组合来实现(有关在此处实现它们的更多详细信息).

WebAPI中的每个请求首先由处理程序处理,然后在执行请求的操作之前,应用过滤器.对于您的示例,身份验证过滤器将保留该DoLogin功能,user.hasPermission逻辑将驻留在授权过滤器中,并且只有操作逻辑将驻留在控制器中的Action(功能)中.

在此输入图像描述