Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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/7/wcf/4.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
C# 使用WCF服务访问';它托管WCF服务_C#_Wcf_Service - Fatal编程技术网

C# 使用WCF服务访问';它托管WCF服务

C# 使用WCF服务访问';它托管WCF服务,c#,wcf,service,C#,Wcf,Service,我显然是WCF和Windows服务的新手 我有一个Windows服务,它只会每秒递增一个整数变量。例如,我想编写一个简单的Windows窗体客户端来显示label控件中变量的当前值 我开始相信,解决这一差距的办法是WCF服务 我试图在Windows服务中托管此WCF服务,但我不知道如何将所有内容链接在一起。WCF服务包含对Windows服务的引用,因此它可以访问整型变量的值 但是,我不需要在Windows服务中放置对WCF服务的引用来承载它吗?如何避免循环依赖 我不需要特定的代码——我只需要知道

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

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

我开始相信,解决这一差距的办法是WCF服务

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

但是,我不需要在Windows服务中放置对WCF服务的引用来承载它吗?如何避免循环依赖

我不需要特定的代码——我只需要知道在概念上是否有可能做我想做的事情以及如何做


谢谢你能提供的任何帮助

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

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

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

  • 计数器逻辑-执行实际计时的程序部分 和递增
  • WCF服务-弥补两者之间差距的部分 我的客户端和服务器
  • Windows服务-承载 WCF服务和我的计数器逻辑
  • Windows窗体客户端-前端 通过WCF与我的Windows服务通信的
  • 接口和数据合同-适用于WCF运营合同和数据合同
这些项目通过以下方式相互参照:

Counter Logic - references Interfaces & Data Contracts
WCF Service - references Interfaces & Data Contracts
Windows Service - references Counter Logic, WCF Service, and Interfaces & Data Contracts
Windows Forms Client - references Interfaces & Data Contracts
Interfaces & Data Contracts - references no other project
  • 计数器逻辑-引用接口和数据契约
  • WCF服务-参考接口和数据合同
  • Windows服务-引用计数器逻辑、WCF服务以及接口和数据协定
  • Windows窗体客户端-引用接口和数据协定
  • 接口和数据合同-无其他项目参考
Windows服务为WCF服务和计数器逻辑提供宿主环境。Windows服务需要引用WCF服务,以便对其进行实例化和托管;WCF服务需要引用Windows服务才能访问计数器逻辑中的整数变量

为了打破这种循环依赖关系,在创建ServiceHost对象时,我没有在WCF服务中引用Windows服务,而是将对计数器逻辑实例的引用从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服务并将_计数器对象作为参数传递给它

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

现在,这个解决方案非常适合我,因为将所有不同的部分放在它们自己的项目中提供了模块化,它允许我创建一个控制台应用程序来托管计数器逻辑和WCF服务,以便进行测试


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

在WCF服务对象中没有计数器引用的情况下,您是如何将计数器对象传递给WCF服务的

 _counterObject = new CounterClass();
 _counterObject.StartCounting();
_wcfService = new CounterWCFService(_counterObject);
这与上面的项目参考列表冲突:

这些项目通过以下方式相互参照:

Counter Logic - references Interfaces & Data Contracts
WCF Service - references Interfaces & Data Contracts
Windows Service - references Counter Logic, WCF Service, and Interfaces & Data Contracts
Windows Forms Client - references Interfaces & Data Contracts
Interfaces & Data Contracts - references no other project

我正试图通过WCF接口上的服务计算出与计数器类的交互通信引用。

我在这里没有看到任何问题,请阅读:这肯定不同于我在其他地方看到的,因为所有内容都包含在一个项目中。我把所有的东西都分解成不同的项目。那么你的wcf服务是独立的吗?还是DLL?@Matt-嗯,我在解决方案中有三个项目——一个用于客户端的Windows窗体应用程序,一个用于托管和计数的Windows服务应用程序,以及一个WCF服务库。所以,我假设它是一个DLL。我对这一点的理解正确吗?到目前为止,我在.NET中的经验是在单个项目的Windows窗体应用程序中。这是我第一次涉足多个项目。是的,我什么都做不到——我没有足够的经验来独自解决这个问题。我看到的每个WCF教程都只是在Windows服务中托管了一个WCF服务,但是WCF不需要来自Windows服务中的任何数据。我不知道我的想法是否完全正确——这是最好的方法吗?在Windows服务中有我的计数逻辑,并使用WCF服务访问它?我束手无策。