私はWCFを学ぼうとしています。簡単なクライアントとサーバーアプリケーションのセットアップがあり、クライアントのボタンを押すと、サーバーから更新された値が取得されます。
次のステップは、サーバーからクライアントへのコールバックを実行して、その値を更新することです。私は多くの例を注いできましたが、それらは大きすぎて混乱しているように見えます。私のC#での実装の最も単純な例を提供できる人はいますか?
オンラインで例を探し続けていますが、何が必要かわからないのですか?もちろん、例を1行ずつコピーすることもできますが、自分のコードでこれを実行したい場合は、何を実装するのかまだわからないので、役に立ちません。
これを実現するために、サーバーコードで実行する必要がある手順と、クライアントコードで実行する必要がある手順について、非常に簡単な例を誰かに教えてもらえますか?
ありがとうございました
これは私が思いつくことができる最も単純な完全な例についてです:
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による「Programming WCF Services、2nd Edition」のコピーを入手してください。本の大部分は、コールバック操作に特化しています。第5章の214ページから始めてください。同時実行管理(ch。8)の章には、さらに詳しい情報があります。
「プログラミングWCFサービス」は、多かれ少なかれWCFの「聖書」です。
私は知っています、古い質問...今日の早い段階でグーグル検索からこの質問に出くわしました。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の不幸な現実は、単純な例などありません。コントラクトの定義、サービスの構成、ホストの使用、クライアントコードの作成が必要です。やや単純な例については この記事 を見てください。