我越来越感到困惑,使用 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();
}
}
}
感谢所有的帮助。