Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有IIS的C#Windows服务中启用远程通信?_C#_Windows_Wcf_Service - Fatal编程技术网

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

如何在没有IIS的C#Windows服务中启用远程通信?,c#,windows,wcf,service,C#,Windows,Wcf,Service,我越来越困惑于使用WCF创建一个简单的Windows服务和一个远程可调用的方法,然后从控制台应用程序调用该方法是多么困难 我可以创建和安装Windows服务,但找不到任何方法允许控制台应用程序与其通信 我的目标如下: 允许Windows服务自宿主WCF服务,公开单个方法,而不管它安装在哪台计算机上 希望控制台应用程序能够在用户输入名称的计算机上调用该方法 不希望要求IIS存在 希望有一个干净、简单、简短的解决方案。一页或更少代码的奖励积分 没有讨厌的过度设计的配置文件 我想如果有必要的话,我

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

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

我的目标如下:

  • 允许Windows服务自宿主WCF服务,公开单个方法,而不管它安装在哪台计算机上
  • 希望控制台应用程序能够在用户输入名称的计算机上调用该方法
  • 不希望要求IIS存在
  • 希望有一个干净、简单、简短的解决方案。一页或更少代码的奖励积分
  • 没有讨厌的过度设计的配置文件
我想如果有必要的话,我可以放弃没有配置文件的目标,但是我对其他目标非常确定

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

有趣的是:定义WCF服务时是否需要接口?为什么服务接口在WCF示例代码中如此重要

提前谢谢大家,

尼克


感谢所有人,我终于想出了以下解决方案

以下基础结构通过Windows服务内的WCF公开Comms类,而不需要配置文件。启用元数据发布,以便我们可以向相关的Console Application tester添加服务引用:

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

        }

    }
谢谢您的帮助。

是-您可以在Windows服务中“自行托管”WCF服务,而无需IIS。。。以下链接提供了入门所需的全部内容(说明、源代码等):

是-您可以在没有IIS的情况下在Windows服务中“自行托管”WCF服务。。。以下链接提供了入门所需的全部内容(说明、源代码等):


为了让控制台应用程序与托管服务对话,您做了哪些尝试?一旦您的服务启动并运行,您就可以在控制台应用程序中添加一个服务引用,让您的应用程序生成客户端类并调用服务方法。。。如果您不想生成客户端代码,那么您是否打算与您的客户端和服务共享库?Nicholas,您不应该害怕阅读MSDN文章。他们通常很有帮助。这不全是巫师和魔法。了解一点WCF将大大有助于您实现自己的目标。为了让控制台应用程序与托管服务对话,您做了哪些尝试?一旦您的服务启动并运行,您就可以在控制台应用程序中添加一个服务引用,让您的应用程序生成客户端类并调用服务方法。。。如果您不想生成客户端代码,那么您是否打算与您的客户端和服务共享库?Nicholas,您不应该害怕阅读MSDN文章。他们通常很有帮助。这不全是巫师和魔法。了解一点WCF将大大有助于你达到你想要的目标。
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();
            }

        }

    }