0

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

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

我的目标如下:

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

我想如果有必要我可以放弃没有配置文件的目标,但我对其他目标非常确定。

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

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

提前谢谢大家,

缺口


感谢大家,我设法将以下解决方案放在一起!

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

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);
                }
            }

        }

    }

下面的类包含整个测试器控制台应用程序。同样,不需要配置文件:

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();
            }

        }

    }

感谢所有的帮助。

4

1 回答 1

3

是的 - 您可以在没有 IIS 的情况下在 Windows 服务中“自托管”WCF 服务...以下链接提供了您开始所需的一切(说明、源代码等):

于 2012-04-04T20:43:55.007 回答