1

场景 A:假设您在同一个 SQL Server/SQL Azure 实例上有多个数据库共享完全相同的结构,其中数据库名称是基于约定的,例如 db001、db002...,并且单个 RESTier 服务必须能够解决每个 REST 调用的正确数据库,具体取决于要在请求标头或 URI 路径或查询字符串上提供的某些特征。

场景 B:单个 RESTier 服务必须能够处理多个连接字符串,在 web.config 文件中定义,具体取决于请求中提供的某些特征。

在这两种情况下,基本问题是相同的,单个 RESTier 服务能够处理多个数据库的请求,其中客户端必须在每个请求上提交要使用的数据库的提示,这是典型的多租户场景。我使用的是 RESTier 0.6 版,实体集自动从实体框架模型中公开:

public class Entities : EntityFrameworkApi<SalesEntities> { 

问题是,您如何建议实施这种多租户场景?

4

2 回答 2

1

您可以使用routePrefix如下所示的参数化并解析 URL ( HttpContext.Current.Request.RawUrl) 的那部分。

config.MapRestierRoute<Entities>("EntitiesApi", "api/{entitiesConfig}", new RestierBatchHandler(server)); 

从您的 Web.config 中检索正确的 connectionString 并使用它来创建 DbContext:

Match match = Regex.Match(HttpContext.Current.Request.RawUrl, @"/api/(?<entitiesConfig>[A-Za-z0-9\-]+)/", RegexOptions.IgnoreCase);
string entitiesConfig = "DefaultEntitiesContext";
if (match.Success)
    entitiesConfig = match.Groups["entitiesConfig"];
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[entitiesConfig].ConnectionString;
var db = new SalesEntities(connectionString);
于 2019-01-17T13:50:12.490 回答
0

对于您的场景,我认为您将有两个 DbContext,每个都连接到一个数据库实例,那么这样的事情对您有用吗?

在 configure 方法中,我们调用 MapRestierRoute 两次,每次都会处理一个 DbContext 具有不同的路由前缀,当用户发起请求时,请求 URL 将包含前缀并自动路由到相关的数据库实例。

config.MapRestierRoute>("TrippinApi", "api/TrippinA", new RestierBatchHandler(server)); config.MapRestierRoute>("TrippinApi", "api/TrippinB", new RestierBatchHandler(server));

如果您对此有任何问题,请告诉我。

于 2016-09-29T03:34:20.693 回答