使用WCF回调需要采取哪些步骤?

kev*_*ley 42 .net c# vb.net wcf callback

我正在努力学习WCF.我有一个简单的客户端和服务器应用程序设置,并在按下客户端上的按钮后,它从服务器获取更新的值.

我的下一步是尝试从服务器到客户端进行回调以更新其值.我已经倾注了许多例子,它们看起来太大而且令人困惑.有没有人可以在C#中提供我最简单的实现示例?

我一直在线查看示例,我只是不明白它需要什么?当然,我可以逐行复制示例,但这对我没有好处,因为如果我想在我自己的代码中执行此操作,我仍然没有实现.

有人可以帮我一个非常简单的例子,说明我需要采取什么步骤以及我需要在服务器代码中做什么,然后在客户端代码中才能实现这一点?

谢谢

Ray*_*gus 85

这是关于我能想出的最简单的完整示例:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了运行示例,需要包含一些名称空间:

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
Run Code Online (Sandbox Code Playgroud)

  • 复制/粘贴此解决方案对我不起作用(VS2010,.NET 4.0).客户端将阻止等待服务器响应,您将获得超时异常.你必须在DoSomething上放置[OperationContract(IsOneWay = true)].或者,您可以自己处理线程,也可以在MyCallbackClient上设置ConcurrencyMode = Multiple,UseSynchronizationContext = false.看到这个问题/答案:http://stackoverflow.com/a/13091230/2184185 (5认同)