基于WinForm的WCF应用

老赵 2009-06-02 11:18:23
我现在搞这么一个项目:

机房里只有一台服务器,连接十几台工业设备(串口、网口)。服务器需要定时获取设备信息,并且控制设备。

操作人员在办公室,通过网络连接到服务器上。设备的信息需要实时的传递给操作人员的桌面电脑,操作人员还需要根据实际情况,给设备下命令,来控制设备。

我现在希望使用WCF技术。服务器上有个WinForm应用程序,提供WCF服务。WinForm应用程序来和硬件设备打交道,然后通过WCF向连接上的客户端广播设备信息。客户端通过WCF,上传对设备的操作指令。

我现在碰见的问题是:
1.网上大多的例子,WCF的服务是控制台应用。但是如果是控制台应用的服务的话,就没法和硬件设备设备打交道。因为对设备的编程中会用到ActiveX控件,还会用到定时器。用户也希望在服务器端有一定的界面显示。

2.如果不用控制台应用的话,使用WinForm应用来提供WCF服务,服务可以启动。但是WinForm中,没法调用服务中的广播,发送,接收等服务,只能看到一个ServiceHost实例。

下面的例子说明:

[ServiceContract(SessionMode = SessionMode.Required,CallbackContract = typeof(ICisdiServiceCallback))]
public interface ICisdiService
{
[OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
string[] Connect(string name);

[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void Send(string msg);

[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SendTo(string to, string msg);

[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void Disconnect();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class CisdiService : ICisdiService
{

public string[] Connect(string name){...}

public void Send(string msg){...}

public void SendTo(string to, string msg){...}

public void Disconnect(){...}

public void BroadcastMessage(CisdiEventArgs e){...}
}

public partial class FrmMain : Form
{
ServiceHost host;

public FrmMain()
{
host = new ServiceHost(typeof(CisdiServer.CisdiService));
host.Open();
}

private void timerParkingPlace_Tick(object sender, EventArgs e)
{
//在此形成需要广播的消息,但是看不到host中的广播方法,也看不到其他的服务方法,如Send等
//BroadcastMessage(e1);
}

}



有没有DX帮忙指点一下。
...全文
2583 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
庄生晓 2010-10-03
  • 打赏
  • 举报
回复
我有一个思路,服务器端再开一个WinApp,这个WinApp只负责采集,采集完后,将数据传给WCF Host,Host再广播给Clients,不知道是否可行。
whltian 2010-08-13
  • 打赏
  • 举报
回复
WCF不是支持双向通信吗
Minideas 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhao_xf 的回复:]
我现在搞这么一个项目:

机房里只有一台服务器,连接十几台工业设备(串口、网口)。服务器需要定时获取设备信息,并且控制设备。

操作人员在办公室,通过网络连接到服务器上。设备的信息需要实时的传递给操作人员的桌面电脑,操作人员还需要根据实际情况,给设备下命令,来控制设备。

我现在希望使用WCF技术。服务器上有个WinForm应用程序,提供WCF服务。WinForm应用程序来和硬件设备打……
[/Quote]

服务端的Host只是启动一个服务,要用客户端程序通过Contract来调用这个Service的一些公开的方法...与是否WINFORM无关...
Minideas 2010-04-14
  • 打赏
  • 举报
回复
WCF能不能广播不大清楚,完全可以让客户端每隔一段时间向服务器要数据啊,这样WCF完全没有问题
mahong2008 2009-10-28
  • 打赏
  • 举报
回复
楼主:
wcf服务配制定义既可以通过app.config,也可以通过代码直接写.如果用winform做为一个服务开启者,提供者,那叫需要把服务配制的定义直接写到代码中去,也就是服务端不需要有app.config.
我可以提供一下代码:
Contract and service:

namespace Service
{
[ServiceContract]
public interface IService
{
[OperationContract]
void DoSomething();
}

public class MyServcie:IService
{
#region IService Members

public void DoSomething()
{
Console.WriteLine("hello world");
}

#endregion
}
}

Host:

namespace Host
{
public partial class MyHost : Form
{
ServiceHost host = null;
NetTcpBinding binding = null;

public MyHost()
{
InitializeComponent();
host = new ServiceHost(typeof(Service.MyServcie));
binding = new NetTcpBinding();
host.AddServiceEndpoint(typeof(Service.IService), binding, "net.tcp://127.0.0.1/myService");
}

private void startButton_Click(object sender, EventArgs e)
{
host.Open();
}

private void stopButton_Click(object sender, EventArgs e)
{
host.Close();
host = null;
}
}
}
客户端的代码就不粘了.
楼主看看是不是可以解决问题
chengqscjh 2009-06-09
  • 打赏
  • 举报
回复
提供服务的函数都在ServiceHost的实例中,宿主启动了ServiceHost的实例,就无法调用实例中的服务了?那么通信如何从服务器端发起?
------------------------------------------------------------------------------------------------------------
你可以将服务的函数单独放在一个工程中,而宿主做为另一个项目,或者你可以用iis来承载你的服务.
老赵 2009-06-08
  • 打赏
  • 举报
回复
项目时间紧,不搞wcf了。改会socket了
xiedu414 2009-06-08
  • 打赏
  • 举报
回复
up下
onion2829 2009-06-08
  • 打赏
  • 举报
回复
mark
老赵 2009-06-04
  • 打赏
  • 举报
回复
顺便想问一下,好像WCF应该有双向通信的能力,也就是采用Duplex方式,客户机和服务器都可以成为通信的发起方。是不是这样啊。
老赵 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jzywh 的回复:]
WCF服务段是用来给客户段提供服务的, 不是服务端自己调用的, 自己调用还需要用WCF干吗?
[/Quote]

主要是服务器需要采集并控制设备,并将采集到的数据发送给客户端。
就好比股票信息发布一样。服务器发布股票的数据。客户机可以从服务器获取股票数据。并且能够告诉服务器“我要买***股”。
不同的是,这个系统要求的实时性比较强(秒级),并且在正常情况下,服务器大约半个小时会向客户机发送一次数据。而客户机必须在第一时间内获取服务器广播出来的数据。所以采用查询的方式有点慢,而且会极大的增加网络的负载。
jmqchomet 2009-06-04
  • 打赏
  • 举报
回复
ding...
老赵 2009-06-04
  • 打赏
  • 举报
回复
回复7楼的chengqscjh

1.楼主应该更加深入的了解WCF.对于第一个问题.WCF的服务并不一定要是控制台应用,控制台,winform只是一种宿主.

2.但是WinForm中,没法调用服务中的广播,发送,接收等服务,只能看到一个ServiceHost实例。这个指定宿主,用来启动服务.至于通信还是靠servicecontract 和 Datacontract和具体的函数来实现通信

=======================================================================================================

提供服务的函数都在ServiceHost的实例中,宿主启动了ServiceHost的实例,就无法调用实例中的服务了?那么通信如何从服务器端发起?
chengqscjh 2009-06-04
  • 打赏
  • 举报
回复
我现在碰见的问题是:
1.网上大多的例子,WCF的服务是控制台应用。但是如果是控制台应用的服务的话,就没法和硬件设备设备打交道。因为对设备的编程中会用到ActiveX控件,还会用到定时器。用户也希望在服务器端有一定的界面显示。

2.如果不用控制台应用的话,使用WinForm应用来提供WCF服务,服务可以启动。但是WinForm中,没法调用服务中的广播,发送,接收等服务,只能看到一个ServiceHost实例。

3.顺便想问一下,好像WCF应该有双向通信的能力,也就是采用Duplex方式,客户机和服务器都可以成为通信的发起方。是不是这样啊。
-------------------------------------------------------------------------------------------------------
1.楼主应该更加深入的了解WCF.对于第一个问题.WCF的服务并不一定要是控制台应用,控制台,winform只是一种宿主.

2.但是WinForm中,没法调用服务中的广播,发送,接收等服务,只能看到一个ServiceHost实例。这个指定宿主,用来启动服务.至于通信还是靠servicecontract 和 Datacontract和具体的函数来实现通信

3.是的
feifeiyiwen 2009-06-03
  • 打赏
  • 举报
回复
WCF服务段是用来给客户段提供服务的
stromboy007 2009-06-02
  • 打赏
  • 举报
回复
這個不太懂·~~~!~頂下·!~~~希望后面的能幫你解決
jzywh 2009-06-02
  • 打赏
  • 举报
回复
WCF服务段是用来给客户段提供服务的, 不是服务端自己调用的, 自己调用还需要用WCF干吗?

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧