Какие шаги я должен сделать для использования Обратных вызовов WCF?

Один из способов сделать это - создать класс «Global» с постоянными значениями и выполнить статический импорт в классы, которым требуется доступ к константе.

42
задан вʀaᴎᴅᴏƞ вєнᴎєƞ 10 February 2015 в 05:47
поделиться

3 ответа

Вот простейший полный пример, который я могу придумать:

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;
85
ответ дан 26 November 2019 в 23:36
поделиться

Возьмите копию «Программирование служб WCF, 2-е издание» Жюваля Лоуи. В книге есть большие разделы, посвященные Callback-операциям. Глава 5 начинается со страницы 214. В главе, посвященной управлению параллелизмом (глава 8), есть еще больше информации.

«Программирование служб WCF» - это более или менее «библия» WCF.

3
ответ дан 26 November 2019 в 23:36
поделиться

Если я правильно прочитал ваш вопрос, вы хотите иметь двусторонний диалог между клиентом и сервером (сервер может связываться с клиентом). WSDualHttpBinding предоставляет вам эту функциональность.

К сожалению, с WCF не существует такой вещи, как простой пример. Это требует, чтобы вы определяли контракты, настраивали службы и использовали хост, а также создавали клиентский код. Взгляните на эту статью , чтобы увидеть довольно простой пример.

2
ответ дан 26 November 2019 в 23:36
поделиться