2012-04-05 11 views
0

WindowsサービスでホストされているWCF環境があります。私は2つのホストを持っています(1つはTCPに、もう1つはNamedPipesにあります)。複数のホストについて警告しないでください。これはメッセージングエンジンであり、ホストは構成に基づいて動的にマウントされます。私が持っているホストの数にかかわらず、サービス実装は1つだけです。今問題は、私のサービス実装が着信呼によって呼び出されたときに、それがホストAかホストBのどちらであったかをどのように識別するのですか?各タイプをホストしている間に、実装からアクセスできるようにホスト情報を識別するメタデータをいくつか指定できますか?助けてください。あなたのサービスの実装内OperationContext.Current.Hostを呼び出すサービス実装からWCFホストを特定する方法

おかげで、 ジェームズ

+0

WCFはすでにMSMQというメッセージングエンジンをサポートしています。これを使用できない理由は何ですか? –

答えて

0

私が直面した問題のための素晴らしい解決策を見つけました。通常、WCFエンドポイントをホストするとき、これは私たちが従うコードです。

ServiceHost serviceHost = new ServiceHost(typeof(IService)) 

ここでは、ServiceHostインスタンスに公開するインターフェイスのタイプを渡します。このアプローチの代わりに、インスタンス化されたオブジェクトを取り込むServiceHostコンストラクタの2番目のオーバーロードを利用できます。今のコードがどのように見えるここで注意すべきこの

ServiceImplementation implementation1 = new ServiceImplementation(); 
ServiceHost serviceHost = new ServiceHost(implementation1); 

だけの事は、あなたが効果的にそれをSinglretonを作り、「InstanceContextMode.Single」として実装インスタンスモードをマークする必要があるということです。

私の問題を解決する方法は、実装クラスを使用してホストから実装にすべてのメタデータを渡すことです。私のコードは今このように見えます。

// Create a metadata class just to hold your data. 
public class MetaData 
{ 
    public MetaData(string data1,int data2) 
    { 
     Data1 = data1; 
     Data2 = data2; 
    } 

    public string Data1 { get; set; } 
    public int Data2 { get; set; } 
} 

//インスタンスをホストに渡すだけです。

MetaData metaData = new MetaData("D1", 100); 
ServiceImplementation implementation1 = new ServiceImplementation(metaData); 
ServiceHost serviceHost = new ServiceHost(implementation1); 

//私の実装では、この

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
internal class ServiceImplementation : IService 
{ 
    private MetaData m_MetaData;  
    public ServiceImplementation(MetaData metaData) 
    { 
     m_MetaData = metaData; 
    } 

    public string Ping(string name) 
    { 
     return m_MetaData.Data1;  
    } 
} 

のように見えますが、メンバーのm_MetaData '内のすべてのメタデータを持っていることを参照してください。

1

は、あなたが電話をホストしている特定のホスト・オブジェクトにアクセスできるようになります。

ホストオブジェクトのタイプとハッシュコードに加えてメタデータが必要な場合は、独自のサービスホストタイプをSystem.ServiceModel.ServiceHostから派生させ、そのメタデータを保持するいくつかのプロパティを与えることができます。例えば

public class MyServiceHost : ServiceHost 
{ 
    public string Name { get; private set; } 

    public MyServiceHost(string name, Type serviceType, params Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) 
    { 
     this.Name = name; 
    } 
} 
+0

私はServiceHostの派生物を作成してあなたのソリューションが好きです。私が投稿した方法が見つからなかったら、私はあなたのものを使ったでしょう。サービス実装をシングルトンにすることができないときは、あなたの解決策は良いと思います。ありがとう、 –

関連する問題