0

これが私の状況です。Firebird データベース、WCF REST サービス (.NET 4.5)、および Windows Mobile 6 クライアントがあります。私が必要としているのは、Firebirds ポスト イベントで、WCF REST がクライアントに通知する必要があることです。

WCF を SOAP サービスとして使用すると二重通信になることは知っていますが、フレームワークのバージョンが非互換のため使用できません。何か案は?これは可能ですか?そうでない場合、代替手段はありますか?私は一般的にWCFに慣れていないので、おそらく何かが足りないのですが、特定の状況に役立つものは何も見つかりませんでした.

PS 私のサービスのコード スニペットが必要な場合はお知らせください。たくさんあるので、この投稿をできるだけきれいに保つようにしています。

4

2 に答える 2

0

解決策を見つけましたが、それがどれほど優れているかは完全にはわかりません。最初に、イベントを「サブスクライブ」するために使用されるWCFメソッドを作成しました

インターフェイス宣言

 [OperationContract]
 [WebInvoke(Method = "GET",
 BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Notification")]
 Stream Notification();

サービスクラスの実装

public Stream Notification()
{
        string result= "";
        using (FbConnection conn= new FbConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
        {
            conn.Open();
            FbRemoteEvent events= new FbRemoteEvent(conn, "event1", "event2", "event3", "event4");
            events.QueueEvents();
            AutoResetEvent waitHandle = new AutoResetEvent(false);
            eventi.RemoteEventCounts += (sender, args) => 
            {
                if (args.Counts > 0)
                {
                    result= args.Name;
                    waitHandle.Set();
                }
            };
            waitHandle.WaitOne();
        }

        return new MemoryStream(Encoding.UTF8.GetBytes(result));
}

post_event が発生するまで AutoResetEvent を使用してサービス インスタンスをフリーズし、それが発生すると AutoResetEvent の Set() メソッドが呼び出されてサービスのフリーズを解除し、私の場合はイベント名を返すので、どのイベントがトリガーされたかがわかります。クライアント側では、別のスレッドでこのメソッドを呼び出し、その応答を待っています。取得したら、それに応じて処理し、同じメソッド要求を再送信して、次の post_event をキャッチできるようにします。

PSこれを機能させるには、InstanceContextModeをPerCallに設定する必要があります。

于 2016-10-12T10:33:55.437 に答える
0

Rest サービスとSignalRの開発には、WCF 経由でASP.NET Web API 2を使用します。

Web API は、Firebird がイベントを投稿したときに、REST Web サービスと SignalR がすべてのクライアントに通知するためのものです。

SignalR は、サーバーとクライアント間の双方向通信を可能にします。

サンプル ハブ:

public class SomeHub: Hub
{
    public void Send(string name, string message)
    {
        Clients.All.broadcastMessage(name, message);
    }
}
于 2016-10-11T15:55:32.070 に答える