【问题标题】:Best way to wait for WCF service?等待 WCF 服务的最佳方式是什么?
【发布时间】:2011-01-12 02:06:21
【问题描述】:

我正在制作一个基本的自托管 WCF 服务,我只是想知道在它接受请求时让它等待的最佳方法是什么?我发现的所有基本教程都只是使用 Console.ReadLine 来等待用户按 Enter 键退出。对于实际应用来说,这似乎不太实用。我试了一会儿(真);循环,但这消耗了所有可用的 CPU 周期,所以它不是一个选项。我也尝试过 Thread.Sleep(0),但是服务在睡眠时不会接受请求,所以这也没有用。我确信有一些常见的方法可以让您的程序“停止”以等待 WCF 请求;有人知道怎么做吗?

我正在使用 C#、.NET 3.5 sp1。

【问题讨论】:

  • 值得注意的是,Thread.Sleep(0) 只休眠足够长的时间让其他线程运行,然后返回。它不会产生等待任何时间的效果。您可能已经为 Thread.Sleep(Timeout.Infinite) (值为-1)无限期阻塞,但 ManualResetEvent 比这更好。
  • 很高兴知道。感谢您的帮助!

标签: c# .net wcf


【解决方案1】:

如果您在单独的线程中运行它(因为它是自托管的),一个简单的选择是使用 ManualResetEvent。

只需在 WCF 线程中调用 manualResetEvent.WaitOne();。这将阻塞(如 Console.ReadLine),直到从单独的线程调用 manualResetEvent.Set()

这里的好处是您也可以有一个干净的机制来关闭服务。

【讨论】:

  • 漂亮。这正是我想要的。我会尽快将此设置为接受的答案。关闭机制也有很大帮助。
【解决方案2】:

一个真正的应用程序,如果它没有 UI,作为 Windows 服务可能会更好。您可以在服务的 OnStart 方法中设置 WCF 服务主机,然后在 OnStop 中将其拆除。

这些示例通常使用控制台应用程序的原因是因为它很容易演示,而不会让读者与无关代码混淆以安装和运行服务。但如果您的服务器不具备交互式 UI,我建议您研究 Windows 服务项目模板。

【讨论】:

  • 他提到这是一个自托管服务。这有很多实际用途,包括将 WCF 服务托管在 Windows 窗体应用程序中等。这通常涉及设置一个线程来托管 WCF 服务,并使用诸如等待句柄之类的技术来防止它关闭。 ..
  • 自托管服务仅仅意味着他正在引导 WCF 而不是 IIS 或其他一些主机进程。 Windows 服务是非交互式自托管服务的推荐应用程序类型。
【解决方案3】:

很容易让 WCF 服务在控制台应用程序中运行。我无法让自托管 WCF 在 Windows 服务中工作。可能有太多安全问题需要处理。为了改进控制台应用服务托管示例,我创建了一个 AttachService 方法,该方法在它自己的线程上运行,如下所示。

public static AutoResetEvent manualReset;

// Host the service within this EXE console application.
public static void Main()
{
  manualReset = new AutoResetEvent(false);

  ThreadPool.QueueUserWorkItem(AttachService);

  //put Set() signal in your logic to stop the service when needed
  //Example:
  ConsoleKeyInfo key;
  do
  {
    key = Console.ReadKey(true);
  } while (key.Key != ConsoleKey.Enter);
  manualReset.Set();
}
static void AttachService(Object stateInfo)
{
  // Create a ServiceHost for the CalculatorService type.
  using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), new Uri("net.tcp://localhost:9000/servicemodelsamples/service")))
  {
    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.

    //Prevent thread from exiting
    manualReset.WaitOne(); //wait for a signal to exit
    //manualReset.Set();
  }
}

我的目标是使用 OnStart 方法中的 Process 类从 Windows 服务执行此控制台应用程序。感谢@Reed Copsey 关于 WaitOne() 的建议。

【讨论】:

  • 从 Process.Start() 测试和工作。在 Windows 10 中,它仅在 Windows 服务在 ServiceAccount.LocalSystem 下运行时才有效。否则,我无法使用 NET.TPC 绑定解决此异常:System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen() 处的 System.ServiceModel.AddressAccessDeniedException。您还需要从 OnStop() 覆盖运行 Process.Kill(),否则 WCF 服务将在 Windows 服务停止后继续在系统上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2010-10-11
  • 2013-12-07
  • 2011-02-04
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多