我正在编写我的第一个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'))
{
}
}
}
}
我的问题是,我该如何实现这种功能:
即:
创建一个应用程序上下文,我可以在其中填充上下文敏感信息,如数据库连接,邮件程序配置,对象工厂,各种状态信息等。
访问用户对象(我可以添加用户凭据,权限等)
是否可以访问会话变量等?
备注
答案 0 :(得分:5)
我正在努力了解从浏览器/前端客户端向Web服务器发送请求后发生的事件序列。
为此我会说this PDF Poster提供了ASP.NET WebAPI中请求处理的最佳图形表示。
我的问题是,我该如何实现这种功能:
即:
创建一个应用程序上下文,我可以在其中填充上下文 敏感信息,如数据库连接,邮件程序 配置,对象工厂,杂项状态信息等。
访问用户对象(我可以添加用户凭据,权限等)
是否可以访问会话变量等?
为此我要说,WebAPI设计为无状态,因此,最好的方法是创建持久会话(在数据库中说)并使用会话标识符(如会话密钥或令牌)来识别每个请求用户并获取他的会话变量/上下文信息。
现在,为了实现您在示例中要求的功能,可以通过身份验证过滤器和授权过滤器(More details on implementing them here)的组合来实现。
WebAPI中的每个请求首先由处理程序处理,然后在执行请求的操作之前,应用过滤器。对于您的示例,身份验证过滤器将保留DoLogin
函数,user.hasPermission
逻辑将驻留在授权过滤器中,并且只有操作逻辑将驻留在控制器中的Action(函数)中。