web-dev-qa-db-ja.com

WCFコールバックを使用するには、どのような手順が必要ですか?

私はWCFを学ぼうとしています。簡単なクライアントとサーバーアプリケーションのセットアップがあり、クライアントのボタンを押すと、サーバーから更新された値が取得されます。

次のステップは、サーバーからクライアントへのコールバックを実行して、その値を更新することです。私は多くの例を注いできましたが、それらは大きすぎて混乱しているように見えます。私のC#での実装の最も単純な例を提供できる人はいますか?

オンラインで例を探し続けていますが、何が必要かわからないのですか?もちろん、例を1行ずつコピーすることもできますが、自分のコードでこれを実行したい場合は、何を実装するのかまだわからないので、役に立ちません。

これを実現するために、サーバーコードで実行する必要がある手順と、クライアントコードで実行する必要がある手順について、非常に簡単な例を誰かに教えてもらえますか?

ありがとうございました

43
kevin bailey

これは私が思いつくことができる最も単純な完全な例についてです:

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
Ray Vernagus

Juval Lowyによる「Programming WCF Services、2nd Edition」のコピーを入手してください。本の大部分は、コールバック操作に特化しています。第5章の214ページから始めてください。同時実行管理(ch。8)の章には、さらに詳しい情報があります。

「プログラミングWCFサービス」は、多かれ少なかれWCFの「聖書」です。

3
Tad Donaghe

私は知っています、古い質問...今日の早い段階でグーグル検索からこの質問に出くわしました。RayVernagusによって提供された答えは、これまで読んだWCFの例を理解するのが最も簡単です。オンラインコンバータを使用せずにVB.NETで書き直すことができたほどです。 Ray Vernagusが提供したサンプルのVB.NETバリアントを追加すると思いました。新しい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

私があなたの質問を正しく読んでいる場合、クライアントとサーバーの間で双方向の会話をしたいと思います(サーバーはクライアントに通信できます)。 WSDualHttpBinding はこの機能を提供します。

WCFの不幸な現実は、単純な例などありません。コントラクトの定義、サービスの構成、ホストの使用、クライアントコードの作成が必要です。やや単純な例については この記事 を見てください。

2
Michael Meadows