如何从服务实现中识别WCF主机



我有一个托管在windows服务上的WCF环境。我有两个主机(一个在TCP上,另一个在NamedPipes上)。不要对多个主机感到担忧——这是一个消息引擎,主机是根据配置动态装载的。无论我有多少种类型的主机,都只有一种服务实现。现在的问题是,当我的服务实现被传入调用时,我如何识别它是来自主机A还是来自主机B?在托管每种类型时,我是否可以指定一些标识主机信息的元数据,以便从实现中访问它?请帮忙。

谢谢,James

在服务实现中调用OperationContext.Current.Host将使您能够访问承载调用的特定主机对象。

如果除了主机对象的类型和Hashcode之外还需要元数据,则可以从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;
    }
}

我为我所面临的问题找到了一个很好的解决方案。通常,当我们托管WCF端点时,这是我们遵循的代码。

ServiceHost serviceHost = new ServiceHost(typeof(IService))

在这里,您可以传递向ServiceHost实例公开的接口的类型。代替这种方法,您可以使用ServiceHost构造函数的第二个重载,它接收一个实例化的对象!现在代码看起来像这个

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"中包含所有元数据。

最新更新