0

WindowsサービスでホストされているWCF環境があります。2つのホストがあります(1つはTCPに、もう1つはNamedPipesにあります)。複数のホストについて心配する必要はありません。これはメッセージングエンジンであり、ホストは構成に基づいて動的にマウントされます。ホストの種類がいくつあっても、サービスの実装は1つだけです。ここで問題となるのは、サービス実装が着信呼び出しによって呼び出された場合、それがホストAからのものかホストBからのものかをどのように識別するのですか?各タイプをホストしているときに、実装からアクセスできるように、ホスト情報を識別するメタデータを指定できますか?助けてください。

ありがとう、ジェームズ

4

2 に答える 2

1

サービス実装内で呼び出すOperationContext.Current.Hostと、呼び出しをホストしている特定のホストオブジェクトにアクセスできます。

ホストオブジェクトのタイプとハッシュコードに加えてメタデータが必要な場合は、から独自のサービスホストタイプを派生させ、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;
    }
}
于 2012-04-06T13:17:41.023 に答える
0

私が直面していた問題の良い解決策を見つけました。通常、WCFエンドポイントをホストする場合、これは従うコードです。

ServiceHost serviceHost = new ServiceHost(typeof(IService))

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

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

ここで注意すべきことは、実装インスタンスモードを「InstanceContextMode.Single」としてマークする必要があることです。これにより、実質的にSinglretonになります。

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

// 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'にすべてのメタデータがあることを確認してください。

于 2012-04-09T15:02:44.260 に答える