Какие шаги мне нужно предпринять, чтобы использовать обратные вызовы WCF? - PullRequest
40 голосов
/ 25 июня 2009

Я пытаюсь выучить WCF. У меня есть простая установка клиентского и серверного приложения, и после нажатия кнопки на клиенте оно получает обновленное значение с сервера.

Мой следующий шаг - я пытаюсь сделать обратный вызов с сервера клиенту, чтобы обновить его значение. Я пролил много примеров, и они кажутся слишком большими и запутанными. Есть ли кто-нибудь, кто может привести мой самый простой пример его реализации в C #?

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

Может кто-нибудь помочь мне с очень простым примером того, какие шаги мне нужно предпринять и что мне нужно сделать в коде сервера, а затем в коде клиента, чтобы это произошло?

Спасибо

Ответы [ 4 ]

82 голосов
/ 25 июня 2009

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

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;
3 голосов
/ 25 июня 2009

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

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

2 голосов
/ 10 февраля 2015

Я знаю, старый вопрос ... Я столкнулся с этим вопросом из поиска в Google ранее сегодня, и ответ, предоставленный Рэем Вернагусом, является самым простым для понимания примером WCF, который я читал на сегодняшний день. Настолько, что я смог переписать его в VB.NET без использования онлайн-конвертеров. Я думал, что добавлю вариант VB.NET примера, который предоставил Рэй Вернагус. Просто создайте новое консольное приложение Windows VB.NET, добавьте ссылку на 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
2 голосов
/ 25 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...