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

本文关键字:数据库 服务 数据 应用程序 wcf | 更新日期: 2023-09-27 18:26:43

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

如何实现这一点,以便客户端能够传入正确的数据库名称或连接字符串?

这个使用WCF数据服务的Different数据库说这是可能的,但并没有具体说明。

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

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

使您的WCF服务会话基于,提供登录方法,在该方法中,您必须决定使用哪个数据库,您可以更改edmx的ConnectionString如果DataModel相同,或者每个客户端的DataModel不同,则必须为每个客户端创建一个edmx实例!

这里有一些简单的pseude代码,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的用户数据部分来解决这个问题,并在每次请求时验证cookie。

如何实现这一点,以便客户端能够传入正确的数据库名称或连接字符串?

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

在我看来,如果你计划拥有很多客户,那么为每个客户部署WCF服务会更有意义。这样,他们就与您的其他客户隔离开来。您仍然可以在同一IIS服务器中承载它们,但可以使用不同的终结点。这也将允许您利用WCF提供的不同身份验证方案。

祝你的解决方案好运。