2011-12-15 10 views
4

私は単一のスキーマを持つODATAサービスを持っています。これらは開発データベースを指し、WCFデータサービスを介して提供され、Excel/Powerpivotを実行しているクライアントがレポートなどのために独自のデータを取得するために使用されます。基本データを使用するOData/WCFデータサービスの実行時の接続文字列の変更

サービスがほとんど同じ基本認証を通じて実行時に確保されているが、ここで説明:http://msdn.microsoft.com/en-us/data/gg192997

をこれは、サーバー上に座ると、ユーザー名に基づいて、異なるデータベースに接続されたライブ環境で作業する必要が今どのように/パスワードが入力されました。ユーザーは「username @ clientID」と「password」と入力します。 'username @ clientID'はsplit()され、username/passwordはSQLデータベースに対してチェックされます。ただし、照合するデータベースサーバーのURLはClientIDによって決まります。

また、WCFデータサービスが承認されると、ClientIDに対応するデータベースからデータを返す必要があります。

私が試みたアプローチは、web.configファイルの接続文字列を変更することでしたが、ファイルが読み取り専用であるため、これは機能しません。これが全然うまくいくかどうかはわかりません。私がする必要があるのは、EDMX/WCFデータサービスが正しいデータベースからデータを返すようにすることです。あなたのDataService派生クラスがCreateDataSourceメソッドをオーバーライド

private static bool TryAuthenticate(string user, string password, out IPrincipal principal) 
    { 

     Configuration myWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
     myWebConfig.AppSettings.Settings["test"].Value = "Hello"; 
     myWebConfig.Save(); 

     string newConnStr = myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ToString(); 
     newConnStr.ToString().Replace("SERGEIX01", "SERVERX01"); 
     myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ConnectionString = newConnStr;    
     myWebConfig.Save(); 

     if (user.ToLower().Equals("admin") && password.Equals("password")) 
     { 
      principal = new GenericPrincipal(new GenericIdentity(user), new string[] { "Users" }); 
      return true; 
     } 
     else 
     { 
      principal = null; 
      return false; 
     } 
    } 

答えて

5

では、それは右の接続文字列を見つけ出すには、接続文字列のためのEFのオブジェクトコンテキストの新しいインスタンスを作成し、それを返す:ここで私はやってみましたものです。 WCF DSサービスは、EFオブジェクトコンテキストで既定のコンストラクタを使用しません。正しい接続文字列でインスタンスを構築することは完全に可能です。あなたのsvc.csファイルで

+0

ありがとう!それはうまくいった。申し訳ありませんが、アップアップしています。それは私に15の担当者が必要だと言います。 – Rash

1

次の行を追加します。

protected override NorthWindEntity CreateDataSource() 
{ 
    System.Data.EntityClient.EntityConnection connection = new System.Data.EntityClient.EntityConnection(); 
    connection.ConnectionString = ""; 
    NorthWindEntity ctx = new NorthWindEntity(connection); 
    return ctx; 
} 
関連する問題