2

私たちはクライアントに販売される ac# .Net アプリケーションを構築しています。SQL Server データベースは私たちがホストします。クライアントごとにデータベースを用意します。1 つの WCF データ サービスを使用して異なるデータベースにアクセスできるかどうかはわかりません。Entity Framework を使用してデータベースを構築します。

クライアントが正しいデータベース名または接続文字列を渡すことができるようにするにはどうすればよいですか?

This Different databases using WCF dataserviceは可能であると述べていますが、実際には詳細には触れていません。

データベースを備えた複数のクライアント用のこのWCFサービス(クライアントごと)は同じ質問のように見えますが、答えはありません。

4

3 に答える 3

2

WCF サービス セッション ベースを作成し、ログイン メソッドを提供します。このメソッドでは、使用するデータベースを決定する必要があります。DataModel が同じ場合、またはクライアントごとに異なる DataModels がある場合は、edmx の ConnectionString を変更できます。クライアントごとに edmx インスタンスを作成する必要があります。

ここでいくつかの単純な疑似コード、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();
    }
}
于 2013-08-07T17:30:02.253 に答える
1

私たちは何年もそれを行っており、それはすべてURLの書き換えに関するものです。

http://the.application/client1/service

http://the.application/client2/service

内部的に同じように書き換えられます

http://the.application/service

しかし同時に、書き換えられた部分は、クライアント コードと接続文字列の間のサーバー側マッピングで接続文字列を見つけるために使用されます。

ここにはセキュリティの問題があります。クライアントがいつでもデータ ソースを切り替えることは望ましくありません。クライアント コードをセキュリティ Cookie のユーザー データ セクションに配置することでこれを解決し、リクエストごとに Cookie を検証します。

于 2013-08-07T20:15:39.323 に答える
0

クライアントが正しいデータベース名または接続文字列を渡すことができるようにするにはどうすればよいですか?

正直なところ、クライアントが使用できる接続文字列について、クライアントにあまり柔軟性を与えません。接続文字列を共通の DB に保存することもできます。これにより、ユーザーの資格情報が正しい接続文字列を返すことができます。

多くの顧客を持つことを計画している場合は、顧客ごとに WCF サービスを展開する方が理にかなっていると思います。そうすれば、彼らは他の顧客から隔離されます。それらを同じ IIS サーバー内でホストすることはできますが、別のエンドポイントを使用することもできます。これにより、WCF によって提供されるさまざまな認証スキームを利用することもできます。

あなたの解決策を頑張ってください。

于 2013-08-07T17:54:09.683 に答える