如何通过wcf服务更新宿主项目中的winform控件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过wcf服务更新宿主项目中的winform控件?相关的知识,希望对你有一定的参考价值。
我有一个客户端解决方案,它是Windows窗体项目,带有一个窗体和按钮“连接”(到wcf服务)。
还有另一个解决方案,它由wcf库项目(用于wcf服务)和Windows窗体项目(用于主机)组成。 WCF服务实现最简单的方法Connect,该方法增加计数器并调用通知客户端的回调。如何通过wcf服务(连接方法)在宿主项目中更新表单控件?
IMonitoringService:
[ServiceContract(CallbackContract = typeof(IMonitoringServiceCallback))]
public interface IMonitoringService
[OperationContract(IsOneWay = true)]
void Connect(string name);
public interface IMonitoringServiceCallback
[OperationContract(IsOneWay = true)]
void Notify(string msg);
MonitoringService:
public class MonitoringService : IMonitoringService
private int _registeredUsers = 0;
public void Connect(string name)
_registeredUsers++;
// How i should update textBox in Host form here?
// Something like this: textBox1.Text = name;
var callback = OperationContext.Current.GetCallbackChannel<IMonitoringServiceCallback>();
callback.Notify(_registeredUsers.ToString());
主持人:
public partial class MonitoringListenerForm : Form
private ServiceHost host = null;
public MonitoringListenerForm()
InitializeComponent();
private void btnStartListen_Click(object sender, EventArgs e)
if (host == null)
host = new ServiceHost(typeof(MonitoringService));
host.Open();
textBox1.Text = "Host started @ " + DateTime.Now.ToString();
private void btnStopListen_Click(object sender, EventArgs e)
host.Close();
host = null;
textBox1.Text = "Host closed @ " + DateTime.Now.ToString();
客户:
public partial class MonitoringClientForm : Form, IMonitoringServiceCallback
private InstanceContext instanceContext = null;
private MonitoringServiceClient client = null;
public MonitoringClientForm()
InitializeComponent();
public void Notify(string msg)
textBox1.Text = "Callback: " + msg;
private void btnConnect_Click(object sender, EventArgs e)
instanceContext = new InstanceContext(this);
client = new MonitoringServiceClient(instanceContext);
try
client.Connect("client1");
catch (Exception ex)
MessageBox.Show(ex.Message);
更新:例如,当客户端连接时,应在监视监听器文本框中显示客户端名称。
答案
可以根据您的描述使用回叫合同。回调函数将调用客户端代码,将需要更新的参数在文本框中放入回调函数中,并将其传递给客户端以执行。客户端将使用从服务器端传递的参数更新文本框。
这是我的演示。使用的绑定是wsdualhttpbinding。
public class MonitoringService : IMonitoringService
private static int _registeredUsers = 0;
public void Connect(string name)
_registeredUsers++;
Console.WriteLine("success");
var callback = OperationContext.Current.GetCallbackChannel<IMonitoringServiceCallback>();
callback.Notify(_registeredUsers.ToString());
这是服务器的代码。服务器端通过回调调用客户端代码并传递一个参数。客户端将获取并执行该参数。
private void button1_Click(object sender, EventArgs e)
instanceContext = new InstanceContext(this);
var client = new MonitoringServiceClient(instanceContext);
try
client.Connect("client1");
catch (Exception ex)
MessageBox.Show(ex.Message);
[STAThread]
static void Main()
Application.EnableVisualStyles();
Application.Run(new Form1());
public void Notify(string msg)
textBox1.Text = "Callback: "+msg;
这是客户代码。客户端实现回调。
这是结果。
public class MonitoringService : IMonitoringService
private static int _registeredUsers = 0;
public void Connect(string name)
_registeredUsers++;
Console.WriteLine("success");
var callback = OperationContext.Current.GetCallbackChannel<IMonitoringServiceCallback>();
callback.Notify("name");
在通知中修改参数。
您可以通过修改通知中的参数来更新客户端文本框的值。
UPDATE
文本框的值可以通过反射获得,然后发送到客户端。
public void Connect(string name)
var callback = OperationContext.Current.GetCallbackChannel<IMonitoringServiceCallback>();
Form1 form = new Form1();
Type type = typeof(Form1);
System.Reflection.FieldInfo propertyInfo = type.GetField("textBox1");
TextBox textBox = (TextBox)propertyInfo.GetValue(form);
callback.Notify(textBox.Text);
以上是关于如何通过wcf服务更新宿主项目中的winform控件?的主要内容,如果未能解决你的问题,请参考以下文章