我有一个托管在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"中包含所有元数据。