我必须为系统创建一个REST风格的Web API(我使用的是ASP.NET Core 1.1),这可能有点不同寻常,因为每个客户端使用这个系统有他们自己的数据库。 (客户就像一家公司,有很多用户在里面)。所以有一个主数据库,它为每个客户端指定它必须连接到哪个数据库。所有的客户端数据库都是相同的(当然数据除外)。如何根据客户端调用使用很多数据库实现Web API
我不知道我应该如何处理这个......通常,当一个应用程序使用Web API,你可能有这样的事情:现在
public class AccountsController : Controller
{
private readonly SomeContext _context;
public FilesController(SomeContext context)
{
_context = context;
}
// GET: api/Files
[HttpGet)]
public IEnumerable<Account> GetAccounts()
{
return _context.Accounts;
}
}
,在上面的例子中,问题是上下文必须指向不同的数据库,具体取决于哪个客户端正在请求帐户列表。我不知道如何最好地解决这个问题。如果前端通过每个API调用在查询字符串中发送一个客户端标识符,它会没事吗?所以每一个控制器动作都会有一个ClientId参数。基于这个参数,动作会在调用之前即时修改Context的连接字符串?这听起来很糟糕 - 无论是从实施和安全的角度来看。问题是,就我所知,ASP.NET是无状态的,所以每次调用API时,API都不知道这是谁?
或者我该怎么办?
对不起,我刚刚意识到我可以使用来自认证服务器(我将使用Auth0)的access_token值来标识用户,因此不需要在每个请求中发送ClientId(每个用户都属于某个客户端) ...然后,就在API访问控制器动作中的上下文之前,它可以修改连接字符串,具体取决于正在执行请求的用户(在访问令牌中) – user1900799
您应该将此添加为可接受的自我回答对可能遇到同样问题的其他人有帮助。 – Nkosi
感谢Nkozi ......我只是意识到,用户实际上可以访问多个数据库(即他可以属于多个客户端)。在这种情况下,登录时,他将不得不选择他想连接的数据库(客户端)。我想前端将不得不发送一个查询字符串与每个API调用,指定选定的数据库(以便控制器操作知道哪个数据库执行查询)?或者,还有更好的方法? – user1900799