我在Windows服务上托管了一个WCF环境。我有两个主机(一个在TCP上,另一个在NamedPipes上)。不要对多个主机发出警告 - 这是一个消息传递引擎,主机根据配置动态安装。无论我有多少类型的主机,都只有一个服务实现。现在的问题是,当我的服务实现被来电调用时,我如何识别它是来自主机A还是主机B?在托管每种类型时,我是否可以指定一些标识主机信息的元数据,以便我可以从实现中访问它?请帮忙。
谢谢, 詹姆斯
答案 0 :(得分:1)
在您的服务实施中调用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;
}
}
答案 1 :(得分: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'中的所有元数据。