2012-03-15 131 views
0

我正試圖在兩個服務之間建立連接。 Service1將發送事件通知給service2。WCF兩個服務之間的回調

我想在這兩個服務之間使用回調。 service1將把事件發送到service2,service2將把事件傳遞給客戶端。

是否可以在兩個服務之間使用回調?

我已經查看了wcf回調的示例,但無法找到服務之間的任何服務通信。

任何幫助appreaciated。請參閱下面的服務1的代碼。 我的問題:其他服務的代碼如何與其中的回調看起來像?

還是在這種情況下,其中一個服務的行爲像一個客戶?那該怎麼看?

服務1碼:(接口類)

public interface IMyEvents 
{ 
    [OperationContract(IsOneWay = true)] 
    void Event1(); 
} 

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMyEvents))] 
public interface SampleInterface 
{ 
    [OperationContract] 
    void DoSomethingAndFireEvent(); 

    [OperationContract] 
    void SubscribeEvent(); 
} 

這是服務類

public class SampleHandlerSimulator : SampleInterface 
{ 
    static Action m_Event1 = delegate { Console.WriteLine("Catch");}; 

    public void SubscribeEvent() 
    { 
     IMyEvents subscriber = OperationContext.Current.GetCallbackChannel<IMyEvents>(); 
     m_Event1 += subscriber.Event1; 
    } 

    public static void FireEvent() 
    { 
     m_Event1(); 
    } 

    public void DoSomethingAndFireEvent() 
    { 
     CCStateHandlerSimulator.FireEvent(); 
    } 

回答

0

通過添加服務引用其中的一個配置您的服務(指的了其他服務)。爲此,請確保要引用的服務已啓動並正在運行,然後右鍵單擊子服務項目並選擇添加服務引用。現在您可以調用父服務公開的方法。

您需要一個配有雙工綁定的終端來進行回叫。有關雙面綁定的信息,請參閱here。將新端點配置添加到父服務時更新您的服務參考。您將需要託管您的服務。

類似的問題被提出here

你enpoint看起來像:

<endpoint address="http://localhost:61775/DUPLEXFUN/" binding="wsDualHttpBinding" 
     bindingConfiguration="" name="DUPEND" contract="IDuplexCallback" /> 

注意wsDualHttpBinding是要注意的重要一點。

您的服務合同將是這樣的:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IDuplexCallback))] 
public interface IDuplexService 
{ 

    [OperationContract(IsOneWay = true)] 
    void FormatString(string institution); 
} 

和服務的實現將是這樣的:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class DuplexService : IDuplexService 
{ 
    IDuplexCallback _callback; 
    string _requestString = String.Empty; 

    public DuplexService() 
    { 
     _callback = OperationContext.Current.GetCallbackChannel<IDuplexCallback>(); 
    } 

    public void FormatString(string text) 
    { 
     //Make the thread to sleep for 10 seconds 
     Thread.Sleep(4000); 
     //Format the input data 
     _requestString = string.Format("Welcome to {0}", text); 
     //Pass the string to the client through the call back function 
     _callback.DuplexCallbackFunction(_requestString); 
    } 
} 

最後IDuplexCallback聲明爲:

public interface IDuplexCallback 
    { 
     [OperationContract(IsOneWay = true)] 
     void DuplexCallbackFunction(string requestString); 
    } 
+0

謝謝您的回答,但我不能讓它運行。我正在使用也是雙工的netnamedpipebinding。我是否必須在兩個服務中實現netnamedpipebinding或者只有一個?你的代碼是否是第二種服務應該如何被推動的例子?因爲如你所見,我已經提供了第一個服務的代碼。而你的代碼不適合我的service1代碼。 – Annonymuze 2012-03-16 09:17:00

+0

我對管道知之甚少,但您只需要在父服務中設置終點,然後在將服務引用添加到子服務後,子服務就會在其配置中反映父服務。我發佈的代碼並不是特定於您的,但它確實會突出顯示您需要的標籤和東西。也許你可以發佈你的父服務app.config? – ldgorman 2012-03-16 14:40:08

+0

PubSub可能會更好,取決於您要完成的工作。我遇到了所有與雙面綁定有關的問題,而且效率並不高。 Pub-Sub的好例子和一個框架可以在這裏找到:http://www.idesign.net/Downloads – PTiddy 2012-03-16 14:59:24