我们正在构建一个将销售给客户的c#.Net应用程序,SQL Server数据库将由我们托管。我们将为每个客户提供一个数据库。我们不确定是否可以使用一个WCF数据服务来访问不同的数据库。使用Entity Framework构建数据库。
如何实现此目的,以便客户端可以传入正确的数据库名称或连接字符串?
这Different databases using WCF dataservice表示这是可能的,但并没有真正详细说明。
此WCF Service for Multiple clients with database(each for client)看起来是同一个问题,但没有答案。
答案 0 :(得分:2)
根据您的WCF服务会话,提供Login-Method,在此方法中您必须决定使用哪个数据库,您可以更改edmx的ConnectionString 如果DataModel相同或者每个客户端有不同的DataModel,则必须为每个客户端创建一个edmx实例!
这里有一些简单的pseude-code,entityID标识客户端
用于创建EntityConnectionString,请查看此Link
要创建基于会话的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();
}
}
答案 1 :(得分:1)
我们这么做多年,所有关于url重写的事情都是这样
http://the.application/client1/service
http://the.application/client2/service
在内部被重写为相同的
http://the.application/service
但同时重写的部分用于在客户端代码和连接字符串之间的服务器端映射中查找连接字符串。
此处存在安全问题,您不希望客户端随时在数据源之间切换。我们通过将客户端代码放在安全cookie的用户数据部分来解决这个问题,并且我们会在每次请求时验证cookie。
答案 2 :(得分:0)
如何实现此目的,以便客户端可以传入正确的数据库名称或连接字符串?
老实说,我不会给客户端太多的灵活性,它可以使用什么连接字符串。您可以将连接字符串存储到一个公共数据库,给定一个用户凭据可以返回正确的连接字符串......但这并没有给我一种温暖和模糊的感觉。
在我看来,如果您计划拥有大量客户,那么为每个客户部署WCF服务会更有意义。这样他们就会与您的其他客户隔离开来。您仍然可以在同一IIS服务器中托管它们,但您可以使用不同的端点。这也可以让您利用WCF提供的不同身份验证方案。
祝你的解决方案好运。