我需要采取什么步骤来使用WCFcallback?
我正在学习WCF。 我有一个简单的客户端和服务器应用程序设置,并按下客户端上的button,它从服务器获取更新的值。
我的下一步是我试图做一个callback从服务器到客户端来更新它的价值。 我经历了很多例子,他们看起来太大而且混乱。 有没有人能给我在C#中最简单的实现例子?
我一直在网上查看例子,我只是不明白它是什么? 当然,我可以一行一行地复制这个例子,但是这样做对我来说并不好,因为如果我想在自己的代码中执行这个操作,我仍然不会执行什么操作。
有人可以帮助我一个非常简单的例子,我需要采取什么步骤,我需要做的服务器代码,然后在客户端代码,使这种情况发生?
谢谢
这是关于我能想出的最简单的完整例子:
public interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceContract(CallbackContract = typeof(IMyContractCallback))] public interface IMyContract { [OperationContract] void DoSomething(); } [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] public class MyService : IMyContract { public void DoSomething() { Console.WriteLine("Hi from server!"); var callback = OperationContext.Current.GetCallbackChannel<IMyContractCallback>(); callback.OnCallback(); } } public class MyContractClient : DuplexClientBase<IMyContract> { public MyContractClient(object callbackInstance, Binding binding, EndpointAddress remoteAddress) : base(callbackInstance, binding, remoteAddress) { } } public class MyCallbackClient : IMyContractCallback { public void OnCallback() { Console.WriteLine("Hi from client!"); } } class Program { static void Main(string[] args) { var uri = new Uri("net.tcp://localhost"); var binding = new NetTcpBinding(); var host = new ServiceHost(typeof(MyService), uri); host.AddServiceEndpoint(typeof(IMyContract), binding, ""); host.Open(); var callback = new MyCallbackClient(); var client = new MyContractClient(callback, binding, new EndpointAddress(uri)); var proxy = client.ChannelFactory.CreateChannel(); proxy.DoSomething(); // Printed in console: // Hi from server! // Hi from client! client.Close(); host.Close(); } }
为了运行这个例子,需要包含一些命名空间:
using System; using System.ServiceModel; using System.ServiceModel.Channels;
抓住Juval Lowy的“编程WCF服务,第二版”的副本。 本书的大部分内容专门用于callback操作。 在第5章中,从第214页开始。在并发pipe理(第8章)一章中,还有更多的信息。
“编程WCF服务”或多或less是WCF的“圣经”。
如果我正确地阅读你的问题,你想在客户端和服务器之间进行双向对话(服务器可以和客户端进行通信)。 WSDualHttpBinding为您提供了这个function。
WCF的不幸现实是,没有这样一个简单的例子。 它要求您定义合同,configuration服务并使用主机,并创build客户端代码。 看看这篇文章的一个简单的例子。
我知道,老问题…我今天早些时候从谷歌search中遇到了这个问题,Ray Vernagus提供的答案是我迄今为止阅读过的最容易理解的WCF示例。 所以我能够在VB.NET中重写它,而不使用任何在线转换器。 我想我会添加Ray Vernagus提供的示例的VB.NET变体。 只需创build一个新的VB.NET Windows控制台应用程序,添加对System.ServiceModel
的引用,并将以下代码复制/粘贴到默认的Module1
类文件中。
Imports System.ServiceModel Imports System.ServiceModel.Channels Public Interface IMyContractCallback <OperationContract()> _ Sub OnCallBack() End Interface <ServiceContract(CallBackContract:=GetType(IMyContractCallback))> _ Public Interface IMyContract <OperationContract()> _ Sub DoSomething() End Interface <ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Reentrant)> _ Public Class Myservice Implements IMyContract Public Sub DoSomething() Implements IMyContract.DoSomething Console.WriteLine("Hi from server!") Dim callback As IMyContractCallback = OperationContext.Current.GetCallbackChannel(Of IMyContractCallback)() callback.OnCallBack() End Sub End Class Public Class MyContractClient Inherits DuplexClientBase(Of IMyContract) Public Sub New(ByVal callbackinstance As Object, ByVal binding As Binding, ByVal remoteAddress As EndpointAddress) MyBase.New(callbackinstance, binding, remoteAddress) End Sub End Class Public Class MyCallbackClient Implements IMyContractCallback Public Sub OnCallBack() Implements IMyContractCallback.OnCallBack Console.WriteLine("Hi from client!") End Sub End Class Module Module1 Sub Main() Dim uri As New Uri("net.tcp://localhost") Dim binding As New NetTcpBinding() Dim host As New ServiceHost(GetType(Myservice), uri) host.AddServiceEndpoint(GetType(IMyContract), binding, "") host.Open() Dim callback As New MyCallbackClient() Dim client As New MyContractClient(callback, binding, New EndpointAddress(uri)) Dim proxy As IMyContract = client.ChannelFactory.CreateChannel() proxy.DoSomething() ' Printed in console: ' Hi from server! ' Hi from client! Console.ReadLine() client.Close() host.Close() End Sub End Module