我有一个不可序列化的对象,我想从一个单独的进程访问。我环顾四周,似乎唯一可行的选择是使用WCF,但我不确定如何做到这一点,因为我是新来的WCF。如果我创建了一个WCF服务,如何将WinForm“挂接”到WCF服务中的各种事件中?例如,用户直接与WCF服务进行通信,我希望我的WinForm客户端得到通知。我如何能够知道用户何时完成了WCF服务的某些操作,并让WinForm客户端了解了这一点?在另一个进程中处理WCF事件
回答
实现您所寻找的一种方法是在您的服务上实施回调合同。然后,你的胜利形式的应用程序将能够“订阅”在服务上发起的事件(例如修改你的对象)。
要做到这一点,你实现了回调契约的服务合同:
[ServiceContract]
public interface IMyService_Callback
{
[OperationContract(IsOneWay = true)]
void NotifyClients(string message);
}
[ServiceContract(CallbackContract = typeof(IMyService_Callback))]
public interface IMyService
{
[OperationContract]
bool Subscribe();
}
然后你实现你的服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyService
{
private List<IMyService_Callback> callbacks;
public MyService()
{
this.callbacks = new List<IMyService_Callback>();
}
private void CallClients(string message)
{
callbacks.ForEach(callback => callback.NotifyClients(message));
}
public bool Subscribe()
{
var callback = OperationContext.Current.GetCallbackChannel<IMyService_Callback>();
if (!this.callbacks.Contains(callback))
{
this.callbacks.Add(callback);
}
// send a message back to the client
CallClients("Added a new callback");
return true;
}
}
在你的WinForms客户端,您只需要实现回调方法:
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public partial class ServiceClient : Form, IMyService_Callback
{
// Sync context for enabling callbacks
SynchronizationContext uiSyncContext;
public ServiceClient()
{
InitializeComponent(); //etc.
uiSyncContext = SynchronizationContext.Current;
// Create proxy and subscribe to receive callbacks
var factory = new DuplexChannelFactory<IMyService>(typeof(ServiceClient), "NetTcpBinding_IMyService");
var proxy = factory.CreateChannel(new InstanceContext(this));
proxy.Subscribe();
}
// Implement callback method
public void NotifyClients(string message)
{
// Tell form thread to update the message text field
SendOrPostCallback callback = state => this.Log(message);
uiSyncContext.Post(callback, "Callback");
}
// Just updates a form text field
public void Log(string message)
{
this.txtLog.Text += Environment.NewLine + message;
}
}
配置服务:
<system.serviceModel>
<services>
<service name="TestService.MyService" behaviorConfiguration="Normal">
<endpoint
address="net.tcp://localhost:8000/MyService"
contract="TestService.IMyService"
binding="netTcpBinding" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Normal" >
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
配置客户端
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8000/MyService"
binding="netTcpBinding"
contract="TestService.IMyService"
name="NetTcpBinding_IMyService">
</endpoint>
</client>
</system.serviceModel>
谢谢,这是一个很好的答案。 – Skoder 2012-01-17 16:04:13
代码实际上并不工作 - 将尽快使用工作代码进行更新。但总的模式是正确的。 – 2012-01-17 16:24:07
现在可以使用代码 - 必须在客户端上用DuplexChannelFactory替换ChannelFactory。 – 2012-01-17 16:55:57
- 1. 在另一个类中处理事件
- 2. 在另一个事件处理程序中调用一个事件处理程序?
- 3. 添加一个事件处理程序到另一个
- 4. 在一个处理程序中处理所有事件?
- 5. 如何访问另一个类中的事件处理程序
- 6. 在另一个类中处理来自控件的事件
- 7. Python中的文件处理:被另一个进程使用
- 8. 如何触发另一个事件中的事件处理程序,C#
- 9. 使用一个事件处理程序进行多个操作
- 10. 在另一个进程中处理断点
- 11. 复制事件处理程序分配给另一个实例
- 12. 将一个元素的事件处理程序附加到另一个JS中
- 13. 3 linkbuttons一个事件处理程序
- 14. 从另一个事件处理程序调用事件处理程序方法并传递额外的参数
- 15. 如何运行从另一个批处理文件,但在一个单独的进程的批处理文件?
- 16. 在一个永久线程中运行事件处理程序
- 17. 在另一个进程中使用的文件错误在批处理
- 18. 如何在一个处理程序中处理多个更改事件?
- 19. 如何在另一个事件处理程序中使用此关键字
- 20. 触发在另一个代码块中分配的jQuery事件处理程序
- 21. 如何删除在另一个事件处理程序中创建的TabControl?
- 22. 从另一个XAMLS处理故事板
- 23. 处理子进程退出事件
- 24. PyQt,Qt,一个事件处理程序,处理很多项目
- 25. 在事件处理程序
- 26. 在元素上停止进一步的事件处理程序
- 27. 处理SMS- onReceive触发另一个活动/类中的事件
- 28. JQuery - 添加另一个事件处理程序,调用前一个
- 29. 在事件处理程序中关闭一个变量
- 30. 我的事件处理程序永远不会调用,因为原始事件在另一个事件处理程序中引发?
我想你应该尝试WCF全双工服务。但你将不得不创建一些逻辑来审计行为并将它们传输到你的winform应用程序 – 2012-01-17 05:44:22
我不确定为什么使用WCF将允许你从另一个进程访问一个不可序列化的对象? – 2012-01-17 08:18:22
@ShoaibShaikh - 我是新来的WCF,但看全双工,似乎它是用户和服务之间的合同。 WinForm客户端是第三方,不直接调用WCF服务。 – Skoder 2012-01-17 15:19:53