【问题标题】:How to implement WCF ServiceModelEx Subscriber?如何实现 WCF ServiceModelEx 订阅者?
【发布时间】:2016-03-09 04:57:13
【问题描述】:

我正在使用来自 Juval Lowy 的“Programming WCF Services”的 ServiceModelEx WCF 库。我正在尝试使用发布者和订阅者实现发布订阅服务。到目前为止我所做的是发布者和发现发布服务。

服务合同:

[ServiceContract]
interface IMyEvents
{
    [OperationContract(IsOneWay=true)]
    void OnEvent1(int number);
}

发现 - 发布服务:

class MyPublishService : DiscoveryPublishService<IMyEvents>, IMyEvents
{
    public void OnEvent1(int number)
    {
        FireEvent(number);
    }
}

发现-发布服务主机:

ServiceHost host = DiscoveryPublishService<IMyEvents>.
CreateHost<MyPublishService>();
host.Open();
// later..
host.Close();

出版商:

IMyEvents proxy = DiscoveryPublishService<IMyEvents>.CreateChannel();
proxy.OnEvent1();
(proxy as ICommunicationObject).Close();

我的问题是如何实现订阅者?书上说要执行服务契约。这很简单。

class EventServiceSubscriber : IMyEvents
{
    public void OnEvent1(int number)
    {
        // do something
    }
}

但是我如何托管订阅者?订阅者如何连接到发布-订阅服务?

【问题讨论】:

    标签: c# wcf servicemodelex


    【解决方案1】:

    为了让它工作,我创建了一个 SubcriptionService,如下所示:

    using ServiceLibrary.Contracts;
    using ServiceModelEx;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Subscriber
    {
        [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any, IncludeExceptionDetailInFaults = DebugHelper.IncludeExceptionDetailInFaults, InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
        class SubscriptionService : DiscoveryPublishService<IMyEvents>, IMyEvents
        {
            public void OnEvent1()
            {
                Debug.WriteLine("SubscriptionService OnEvent1");
            }
    
            public void OnEvent2(int number)
            {
                Debug.WriteLine("SubscriptionService OnEvent2");
            }
    
            public void OnEvent3(int number, string text)
            {
                Debug.WriteLine("SubscriptionService OnEvent3");
            }
        }
    }
    

    然后我为这个服务设置一个主机如下:

    ServiceHost<SubscriptionService> _SubscriptionHost = DiscoveryPublishService<IMyEvents>.CreateHost<SubscriptionService>();
    _SubscriptionHost.Open();
    

    可以在我的 Github 帐户中的以下 url 中找到一个基本的工作示例。

    https://github.com/systemsymbiosis/PublishSubscribeWithDiscovery

    【讨论】:

    • 托管服务的最佳方式是创建 Windows 服务。您可以在 Visual Studio 项目创建者中使用 Windows 服务向导。
    【解决方案2】:

    围绕这个主题有很多文章。首先,this 一个。您可以通过不同的方式托管您的订阅者,例如控制台应用程序或 ASP.NET 应用程序。每种应用程序类型都有某种启动方法,因此这是实现订阅/发布逻辑的好地方。

    【讨论】:

    • 您自己博客的链接可能会损坏吗?
    • @zellus 是的。无论如何,这是一个转贴。查看更新的链接。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多