如何通过wcf dataservice让应用程序使用不同的数据库

我们正在构建将销售给客户的ac#.Net应用程序,SQL Server数据库将由我们托管。 我们将为每个客户提供一个数据库。 我们不确定是否可以使用一个WCF数据服务来访问不同的数据库。 使用Entity Framework构建数据库。

如何实现此目的,以便客户端可以传入正确的数据库名称或连接字符串?

这个使用WCF数据服务的不同数据库表示它是可能的,但并没有真正涉及具体细节。

具有数据库的多个客户端(每个用于客户端)的此WCF服务看起来是相同的问题,但没有答案。

根据您的WCF服务会话,提供Login-Method,在此方法中您必须决定使用哪个数据库,如果DataModel相同或者每个客户端有不同的DataModel,您可以更改edmx的ConnectionString你必须为每个客户端创建一个edmx实例!

这里有一些简单的pseude-code,entityID标识客户端

用于创建EntityConnectionString,请查看此链接

要创建基于会话的WCF服务,您必须像这样定义服务接口

[ServiceContract(SessionMode = SessionMode.Required)] public interface ISampleService { [OperationContract] void Login(string user, string password, int entityID); } 

并且ServiceImplementation应具有这些属性,根据您的需要更改这些值

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = true)] public class SampleService : ISampleService { SampleEntities datacontext = null; public void Login(string user, string password, int entityID) { if(CheckLoginData(user, password)) { InitDataContext(entity_id); } } private void InitDataContext(int entityID) { var connectionString = GetConnectionStringFromEntityID(entityID); datacontext = new SampleEntities(connectionString); } private string GetConnectionStringFromEntityID(int entityID) { var providerName = "System.Data.SqlClient"; var serverName = "localhost"; var databaseName = GetDatabaseNameFromEntityID(entityID); var sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = serverName; sqlBuilder.InitialCatalog = databaseName; sqlBuilder.IntegratedSecurity = true; var providerString = sqlBuilder.ToString(); var entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = providerName; entityBuilder.ProviderConnectionString = providerString; entityBuilder.Metadata = @"res://*/SampleDatabase.csdl| res://*/SampleDatabase.ssdl| res://*/SampleDatabase.msl"; return entityBuilder.ToString(); } } 

我们这么做多年,所有关于url重写的事情都是如此

HTTP://the.application/client1/service

HTTP://the.application/client2/service

在内部被重写为相同的

HTTP://the.application/service

但同时重写的部分用于在客户端代码和连接字符串之间的服务器端映射中查找连接字符串。

这里存在安全问题,您不希望客户随时在数据源之间切换。 我们通过将客户端代码放在安全cookie的用户数据部分来解决这个问题,并且我们在每次请求时validationcookie。

如何实现此目的,以便客户端可以传入正确的数据库名称或连接字符串?

老实说,我不会给客户端太多的灵活性,它可以使用什么连接字符串。 您可以将连接字符串存储到一个公共数据库,给定一个用户凭据可以返回正确的连接字符串……但这并没有给我一种温暖和模糊的感觉。

在我看来,如果您计划拥有大量客户,那么为每个客户部署WCF服务会更有意义。 这样他们就会与您的其他客户隔离开来。 您仍然可以在同一IIS服务器中托管它们,但您可以使用不同的端点。 这还允许您利用WCF提供的不同身份validation方案。

祝你的解决方案好运。