我必須爲系統創建一個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