繁体   English   中英

如何在没有 IIS 的情况下在 C# Windows 服务中启用远程通信?

[英]How to enable remote communication in a C# Windows Service without IIS?

使用 WCF 使用单个远程调用方法创建简单的 Windows 服务,然后从控制台应用程序调用该方法是多么困难,这让我越来越感到困惑。

我可以创建和安装 Windows 服务,但找不到任何方法允许控制台应用程序与其通信。

我的目标如下:

  • 允许 Windows 服务自行托管 WCF 服务,无论它安装在什么机器上,都公开一个方法。
  • 希望控制台应用程序能够在用户输入其名称的计算机上调用该方法。
  • 不想要求 IIS 存在。
  • 想要一个干净、简单、简短的解决方案。 一页或更少代码的奖励积分。
  • 没有讨厌的过度设计的配置文件。

我想我可以在必要时放弃没有配置文件的目标,但我对其他目标很确定。

除了向我指出长而复杂的 MSDN 文章或书籍之外,是否有人有任何用于公开和使用该服务的示例代码? 非常感谢您的帮助。 我 promise 最终完全阅读了 WCF - 我所需要的只是一个开始!

作为一个兴趣点:定义 WCF 服务时是否需要接口? 为什么服务接口在 WCF 示例代码中如此普遍?

在此先感谢大家,

缺口


感谢所有我设法组合以下解决方案的人!

以下基础架构通过 Windows 服务中的 WCF 公开 Comms class,无需配置文件。 启用元数据发布,以便我们可以添加对相关控制台应用程序测试器的服务引用:

namespace AgentService
    {
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceProcess;

    [ServiceContract]
    public class Comms
        {
        [OperationContract]
        public string GetStatus() { return "Running"; }
        }

    public class SelfHost<T>
        {

        private ServiceHost host = null;

        public void Start()
            {
            var baseAddress = new Uri("http://localhost:8080/AgentService/");
            host = new ServiceHost(typeof(T), baseAddress);
            var behaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true };
            host.Description.Behaviors.Add(behaviour);
            host.Open();
            }

        public void Stop() { host.Close(); }

        }

    public static class Program
        {

        public static void Main(string[] args)
            {
            if (args.Length > 0)
                {
                var host = new SelfHost<Comms>();
                host.Start();
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
                host.Stop();
                }
            else
                {
                var servicesToRun = new ServiceBase[] { new AgentService() };
                ServiceBase.Run(servicesToRun);
                }
            }

        }

    }

以下 class 包含整个测试仪控制台应用程序。 同样,不需要配置文件:

namespace Tester
    {
    using System;
    using System.ServiceModel;
    using Tester.Comms;

    public class Program
        {

        public static void Main(string[] args)
            {
            var comms = new CommsClient(new BasicHttpBinding(),
                                        new EndpointAddress("http://localhost:8080/AgentService/"));
            Console.WriteLine(comms.GetStatus());
            Console.ReadKey();
            }

        }

    }

感谢所有的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM