2011-07-26 11 views
2

これは以前の質問とは別の質問ですが、(マルチテナントWCFサービス)WCFのURLルーティングを使用したパラメータの少ないメソッド

多くを検索した後、私はWCFの問題を解決するための最良のソリューションを見つけることができません。

SVCファイルは1つだけですが、アクセスする複数のURLがあります。組織Org1のURLはhttp://CRMserver_name/Org1/XRMServices/2011/Organization.svc、Org2はhttp://CRMserver_name/Org2/XRMServices/2011/Organization.svc

URLルーティングを使用していましたが、問題は、私たちが望ましくないRESTサービスを作成していることです。通常のWCFサービスと同様に、これらのサービスにアクセスできる必要があります。したがって、URL http://CRMserver_name/Org1/XRMServices/2011/Organization.svcをWCFテストクライアントに追加すると、それが機能するはずです。

CRMがそうしているので、方法がありますが、私はそれを見つけることができません。私を助けてください!

おかげで、 Nilesh

答えて

0

多くの研究の後、私はこれを達成するために安全な方法で行くつもりです。私はテナントごとに別々のWCFプロジェクトを作成し、別々のIIS仮想ディレクトリにホストします。例: テナント1の場合 - http://localhost/ Tenant1/Service1.svc、テナント2の場合 - http://localhost/Tenant2/Service1.svc SVC名は同じです。次に、Tenant2からIService1.csとService1.svc.csを削除し、既存のファイルをTenant1のリンクとして追加します。新しいテナントごとにこれを行う必要があります。そのため、これは純粋な解決策ではありません。今私のソリューションエクスプローラは次のようになります。

SoluExp

ここWcfService3はTenant1とWcfService1です(誰かが必要な場合は、この混乱の名前について申し訳ありません。私はそれを修正する可能性がある)Tenant2ためです。 WcfService3のプロパティは次のようになります。両方http://localhost/ Tenant1/Service1.svchttp://localhost/ Tenant2/Service1.svcサービスコードのための今すぐ

Project Prop

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

1

私はこれがあなたの問題を解決するだろうかどうかわからないけど、IIS URL書き換えモジュールを見てください。あなたの問題を解決するかもしれません。

+0

サービスのメソッドが呼び出されたときにURLリライティングを試みましたが、URI- baseURI \ {orgName} \ Service1.svcからテナント名にアクセスするソリューションを用意できませんでした。 – Nilesh

0

私はよりよいアプローチだと思っています。 IncomingMessageHeadersオブジェクトからターゲットUriを取得しようとするのではなく、代わりにHttpRequestヘッダーからサーバーのホストビューを取得します。ここで

は、2つの方法でこれを証明私が作成したサービスのメソッドのカップルです:

  1. GetTenantByRewrittenURL URLと一緒に作品が2.0ルールを書き換えます。このルールは、Uriパスの最初の部分(ドメインの後)にテナント名を見つけます。 www.mydomain.com/ テナント1/MyService.svc。次に、(a)URLを書き換えてテナントIDを取り除き、(b)HTTP_REFERERヘッダーフィールドにテナントIDを格納します。わからない場合は、URL書き換えルールを使用してこれを行うことができます。 URLリライト設定で受け入れたサーバー変数のリストにHTTP_REFERERを追加することも忘れないでください。

  2. GetTenantByFakeHostは、ホストヘッダーと連動して動作します。このために、私は形で要求を期待する私のIISバインドにホストヘッダーを追加しましたtenant1 .mydomain.com/MyService.svc

これは、あなたが目指したものを達成するために表示され、 OperationContextを介して中間層全体のHttpヘッダーにアクセスできるはずですが、まだ確認していません。

+0

投稿に署名を含める必要はありません。あなたのユーザーカードは自動的に追加されます。詳細については、[FAQ](http://stackoverflow.com/faq#signatures)を参照してください。 – Artemix

関連する問題