多くの研究の後、私はこれを達成するために安全な方法で行くつもりです。私はテナントごとに別々のWCFプロジェクトを作成し、別々のIIS仮想ディレクトリにホストします。例: テナント1の場合 - http://localhost/ Tenant1/Service1.svc
、テナント2の場合 - http://localhost/Tenant2/Service1.svc
SVC名は同じです。次に、Tenant2からIService1.csとService1.svc.csを削除し、既存のファイルをTenant1のリンクとして追加します。新しいテナントごとにこれを行う必要があります。そのため、これは純粋な解決策ではありません。今私のソリューションエクスプローラは次のようになります。
ここWcfService3はTenant1とWcfService1です(誰かが必要な場合は、この混乱の名前について申し訳ありません。私はそれを修正する可能性がある)Tenant2ためです。 WcfService3のプロパティは次のようになります。両方http://localhost/ Tenant1/Service1.svc
とhttp://localhost/ Tenant2/Service1.svc
サービスコードのための今すぐ
WcfServices3-> Service1.svc.csである、単一の場所です。次のコードは、特定のメソッド呼び出しのためのデータベース接続オブジェクトを作成します。
private static string dbServerName = "YourDBServerName";
private static SqlConnection dbConnection = createDBConnection();
private static SqlConnection createDBConnection()
{
Uri fullUri = OperationContext.Current.IncomingMessageHeaders.To;
Uri baseAddress = new Uri(@"http://localhost");
UriTemplate template = new UriTemplate(@"/{orgName}/Service1.svc");
// retrieve the value of the artist segment
UriTemplateMatch match = template.Match(baseAddress, fullUri);
String orgName = match.BoundVariables["orgName"];
SqlConnection objConnection = new SqlConnection();
objConnection.ConnectionString = createConnString(orgName);
return objConnection;
}
private static string createConnString(string orgName)
{
return (String.Format("Data Source={0};Initial Catalog={1}_MSCRM;User Id=UserId1;Password=PasswordForUserId1;", dbServerName, orgName));
}
私は、これは周りの問題の真の解決策(マルチテナントWCFサービス)は、素早く簡単で安全な作業ではありません知っています。これが誰かを助けることを望みます。また、ここで問題が発生した場合や、より良い解決策がわかっている場合は、私に知らせてください。
-nilesh
サービスのメソッドが呼び出されたときにURLリライティングを試みましたが、URI- baseURI \ {orgName} \ Service1.svcからテナント名にアクセスするソリューションを用意できませんでした。 – Nilesh