【问题标题】:How to identify the WCF host from service implementation如何从服务实现中识别 WCF 主机
【发布时间】:2012-04-05 22:03:30
【问题描述】:

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

谢谢, 詹姆斯

【问题讨论】:

  • WCF 已经支持称为 MSMQ 的消息传递引擎。你有什么理由不能用这个?

标签: wcf wcf-hosting


【解决方案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;
    }
}

【讨论】:

  • 我喜欢您的解决方案,因为它创建了 ServiceHost 的派生。如果我没有找到我发布的方法,我会使用你的。我认为当我们不能使服务实现成为单例时,你的解决方案会很好。谢谢,
【解决方案2】:

我为我所面临的问题找到了一个很好的解决方案。通常,当我们托管 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”中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多