【问题标题】:WCF: Notify Clent Server Connction in both sides (Service Self Hosted as console application)WCF:通知双方的客户端服务器连接(服务自托管作为控制台应用程序)
【发布时间】:2019-12-23 16:04:35
【问题描述】:

我有一个 WCF 服务,它自托管在控制台应用程序上。我可以成功连接和通信。

建立连接后,我需要将一些数据从服务器推送到客户端。我怎么能理解客户端已连接,反之亦然(客户端知道服务器连接何时建立)。

//创建一个URI作为基地址 uri httpUrl = new Uri("http://localhost:8090/TAOInventoryService/InventoryManager");

        //Create ServiceHost
        ServiceHost host = new ServiceHost(typeof(TAOInventoryService.InventoryManager), httpUrl);

        //Add a service endpoint
        host.AddServiceEndpoint(typeof(TAOInventoryService.IInventoryManager ), new WSHttpBinding(), "");

        //Enable metadata exchange
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        host.Description.Behaviors.Add(smb);

        //Start the Service
        host.Open();
        Console.WriteLine("Service is host at " + DateTime.Now.ToString());
        Console.WriteLine("Host is running... Press  key to stop");
        Console.ReadLine();

【问题讨论】:

    标签: wcf


    【解决方案1】:

    我可能不完全理解您的问题。在我看来。这有点像在线和离线通知。服务端在线时,可以主动向客户端推送公告消息。
    这是我写过的一个例子,希望对你有用。
    Server.

    static void Main(string[] args)
            {
                Uri uri = new Uri("http://localhost:21011");
                BasicHttpBinding binding = new BasicHttpBinding();
                binding.Security.Mode = BasicHttpSecurityMode.None;
                using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
                {
                    sh.AddServiceEndpoint(typeof(IService), binding, "");
                    ServiceMetadataBehavior smb;
                    smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                    if (smb == null)
                    {
                        smb = new ServiceMetadataBehavior()
                        {
                            HttpGetEnabled = true
                        };
                        sh.Description.Behaviors.Add(smb);
                    }
                    ServiceDiscoveryBehavior sdb = new ServiceDiscoveryBehavior();
                    sdb.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint());
                    sh.Description.Behaviors.Add(sdb);
                    sh.AddServiceEndpoint(new UdpDiscoveryEndpoint());
                    Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
                    sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
                    sh.Opened += delegate
                    {
                        Console.WriteLine("Service is ready");                    
                    };
                    sh.Closed += delegate
                    {
                        Console.WriteLine("Service is clsoed");                    
                    };
                    sh.Open();
                    Console.ReadLine();
                    //pause
                    sh.Close();
                    Console.ReadLine();
                }
            }
        }
        [ServiceContract]
        public interface IService
        {
            [OperationContract]
            Int32 Add(Int32 Num1, Int32 Num2);
    
        }
        [ServiceBehavior]
        public class MyService : IService
        {
            public int Add(int Num1, int Num2)
            {
                return Num1 + Num2;
            }
        }
    

    客户。

    static void Main(string[] args)
            {
    
                Console.Title = "Start client first";
    
                AnnouncementService annsvc = new AnnouncementService();
                annsvc.OnlineAnnouncementReceived += OnlineRec;
                annsvc.OfflineAnnouncementReceived += OfflineRec;
                using (ServiceHost host = new ServiceHost(annsvc))
                {
                    host.AddServiceEndpoint(new UdpAnnouncementEndpoint());
                    host.Open();
                    Console.Read();
                }
            }
    
            private static void OfflineRec(object sender, AnnouncementEventArgs e)
            {
                Console.WriteLine($"\nService is offline, service address:{e.EndpointDiscoveryMetadata.Address.Uri}");
            }
    
            private static void OnlineRec(object sender, AnnouncementEventArgs e)
            {
                Console.WriteLine($"\nService is online, service address:{e.EndpointDiscoveryMetadata.Address.Uri}");
            }
    

    结果。

    官方文档。
    https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/dd483353(v=vs.100)
    如果有什么可以帮助的,请随时告诉我。

    【讨论】:

    • 非常感谢。让我尝试根据我的场景调整它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2011-10-05
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多