c# - 使用 WCF 服务访问托管 WCF 服务的 Windows 服务中的数据

标签 c# wcf service

我显然是 WCF 和 Windows 服务的新手。

我有一个 Windows 服务,它每秒只增加一个整数变量。例如,我想编写一个简单的 Windows 窗体客户端来显示标签控件中变量的当前值。

我开始相信弥合这一差距的答案是 WCF 服务。

我正在尝试在 Windows 服务中托管此 WCF 服务,但我不知道如何将所有内容链接在一起。 WCF 服务包含对 Windows 服务的引用,因此它可以访问整数变量的值。

但是,我不需要在 Windows 服务中引用 WCF 服务来托管它吗?如何避免循环依赖?

我不一定需要特定的代码——我只需要知道是否可以从概念上做我想做的事情以及如何去做。

感谢您提供的任何帮助!

最佳答案

我回去重写了所有内容。我对将所有内容都放在同一个程序集中完全不满意,所以我回去重新设计了整个应用程序。

以下是我最终构建此解决方案的方式:

我最终在该解决方案中完成了五个项目(如果算上我用于测试的控制台应用程序,则为六个):

  • 计数器逻辑 - 执行实际计时的程序部分 并递增
  • WCF 服务 - 弥合两者之间差距的部分 我的客户和服务器
  • Windows 服务 - 承载 WCF 服务和我的计数器逻辑
  • Windows 窗体客户端 - 前端 通过 WCF 与我的 Windows 服务通信
  • 接口(interface)和数据契约(Contract) - 用于 WCF 操作契约(Contract)和数据契约(Contract)

项目通过以下方式相互引用:

  • 反逻辑 - 引用接口(interface)和数据契约
  • WCF 服务 - 引用接口(interface)和数据协定
  • Windows 服务 - 引用计数器逻辑、WCF 服务以及接口(interface)和数据协定
  • Windows 窗体客户端 - 引用接口(interface)和数据协定
  • 接口(interface)和数据契约(Contract) - 未引用其他项目

Windows 服务为 WCF 服务和计数器逻辑提供宿主环境。 Windows 服务需要引用 WCF 服务以便实例化和托管它; WCF 服务需要引用 Windows 服务才能访问计数器逻辑中的整数变量。

为了打破这种循环依赖,我没有在 WCF 服务中引用 Windows 服务,而是在创建 ServiceHost 对象时将对计数器逻辑实例的引用从 Windows 服务发送到 WCF 服务:

在 Windows 服务项目中:

protected override void OnStart(string[] args)
{
    if (_serviceHost != null)
    {
        _serviceHost.Close();
    }

    _counterObject = new CounterClass();
    _counterObject.StartCounting();

    _wcfService = new CounterWCFService(_counterObject);

    _serviceHost = new ServiceHost(_wcfService);
    _serviceHost.Open();
}

但是,这一方案至少有一个缺点。为了将计数器逻辑实例作为参数传递给 WCF 服务,我无法使用接受 WCF 服务类型的典型 ServiceHost 构造函数。此构造函数只能在 WCF 服务的构造函数无参数时使用。相反,我使用了接受 WCF 服务实例的重载构造函数。这就是我在将 WCF 服务传递给 ServiceHost 之前实例化 WCF 服务并将 _counterObject 作为参数传递的原因。

这将我们限制为指定为单例 (InstanceContextMode = Single) 的 WCF 服务。由于在任何给定时间只有一个客户端访问我的服务,这对我来说是可以接受的,但如果我希望我的 future ,我将需要研究其他方法来访问标准 ServiceHost 构造函数创建的 WCF 服务实例应用程序可扩展。

这个解决方案现在非常适合我,并且由于将所有不同的部分放在他们自己的项目中所提供的模块化,它允许我创建一个控制台应用程序来托管 Counter Logic 和 WCF 服务以进行测试,因为好吧。

在我的机器上安装 Windows 服务之前,我能够在控制台应用程序中调试所有内容,这样我只需要安装我的服务一次,然后启动它。

关于c# - 使用 WCF 服务访问托管 WCF 服务的 Windows 服务中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420265/

相关文章:

c# - 来自部分内部的 Asp.Net MVC 父 Html.ViewBag

.net - REST 服务中的事件 ID 传播

android - 三星 Galaxy A5 中的自定义对话框未显示在来电屏幕上

c# - 如何自动将 .Net 3.5 升级到 .Net 4.0,包括引用资料?

C# 字符串 ASCII 表示

c# - disqus API 缺少必需的参数 : grant_type

跨多项 Activity 的 Android 全面防故障音乐服务

c# - 为什么这个简单的 RESTful WCF 服务会因 404 错误而失败?

.net - 如果我使用 WCF w/forms auth,php 或 java 客户端将如何进行身份验证?

angularjs - Angular “Module ' mainController'不可用!”