0

我有一个托管在 Windows 服务上的 WCF 环境。我有两台主机(一台在 TCP 上,另一台在 NamedPipes 上)。不要对多台主机感到惊慌——这是一个消息传递引擎,主机是根据配置动态安装的。不管我有多少类型的主机,只有一种服务实现。现在的问题是,当我的服务实现被来电调用时,我如何识别它是来自主机 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 构造函数的第二个重载,它接收一个实例化的对象!现在代码看起来像这样

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 回答