2012-07-27 129 views
0

所以我有一個客戶端應用程序和一個WCF服務發佈到IIS服務器。我成功地讓客戶訂閱了WCF服務,然後在任何一個客戶端上點擊一個按鈕後,將消息推送到客戶端應用程序的每個實例。現在我的目標是從WCF應用程序推出消息,但通過Web瀏覽器中的REST消息,然後允許我在Android中使用此接口並在Android客戶端和Windows客戶端應用程序之間進行交互。任何人都知道我需要做什麼?這是我工作的界面的基礎知識。用REST公開WCF回調

IService.vb:

<ServiceContract(SessionMode:=SessionMode.Required, CallbackContract:=GetType(IServiceCallback))> 
Public Interface IService 
    <OperationContract(IsOneWay:=True)> 
    Sub GetClientCount() 

    <OperationContract(IsOneWay:=True)> 
    Sub RegisterClient(ByVal id As Guid) 

    <OperationContract(IsOneWay:=True)> 
    Sub UnRegisterClient(ByVal id As Guid) 
End Interface 

Public Interface IServiceCallback 
    <OperationContract(IsOneWay:=True)> 
    Sub SendCount(ByVal count As Int32) 
End Interface 

Service.svc.vb

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single, ConcurrencyMode:=ConcurrencyMode.Multiple)> 
Public Class Service 
    Implements IService, IRestService 
    Private clients As New Dictionary(Of Client, IServiceCallback)() 
    Private locker As New Object() 

    Public ReadOnly Property Callback As IServiceCallback 
     Get 
      Return OperationContext.Current.GetCallbackChannel(Of IServiceCallback)() 
     End Get 
    End Property 

    'called by clients to get count 
    Public Sub GetClientCount() Implements IService.GetClientCount 
     Dim query = (_ 
     From c In clients _ 
     Select c.Value).ToList() 

     Dim action As Action(Of IServiceCallback) = Function(Callback) GetCount(Callback) 

     query.ForEach(action) 
    End Sub 

    Private Function GetCount(ByVal callback As IServiceCallback) As Int32 
     callback.SendCount(clients.Count) 
     Return Nothing 
    End Function 

    '---add a newly connected client to the dictionary--- 
    Public Sub RegisterClient(ByVal guid As Guid) Implements IService.RegisterClient 
     '---prevent multiple clients adding at the same time--- 
     SyncLock locker 
      clients.Add(New Client With {.id = guid}, Callback) 
     End SyncLock 
    End Sub 

    '---unregister a client by removing its GUID from 
    ' dictionary--- 
    Public Sub UnRegisterClient(ByVal guid As Guid) Implements IService.UnRegisterClient 
     Dim query = From c In clients.Keys _ 
        Where c.id = guid _ 
        Select c 
     clients.Remove(query.First()) 
    End Sub 
End Class 

回答

3

在HTTP一般基於推送的實現是相當困難的。用於實現這一點的Commom技術要麼是反向Ajax,Web套接字長輪詢(有些甚至使用單個像素柔性對象來保持套接字永久打開)。 看看這Code Project Article,它使用反向Ajax aka Commet實現一個wcf休息服務能夠推送通知。

+0

所以,即使我不需要WCF服務對Android設備的響應,它不是很直截了當嗎?我想從HTTP觸發事件,所以回調被推送到WPF客戶端,所以沒有東西會通過HTTP發回。只是想確保我完全理解這一點。謝謝。 – bflosabre91 2012-07-30 13:21:25

+0

我沒有完全明白你的問題。您能否請您解釋您正在嘗試解決的問題 – Anand 2012-07-31 04:55:50

+0

在我的WCF服務中,我有Windows客戶端應用程序訂閱了一個回調,該回調在客戶端應用程序的任何打開實例啓動回調時起作用。但不是回調從與Windows客戶端的某種交互發送到開放客戶端應用程序,而是像回叫服務一樣從一個Android客戶端向Windows客戶端發送消息。我希望將它設置爲我可以用REST做到這一點。所以我想添加到WCF服務的能力去http://myservice.com/service1.svc/sendtoclient/test和「測試」將被髮送到客戶端。 – bflosabre91 2012-08-02 13:25:02

0

您需要從Android設備發送消息到wcf服務,然後wcf服務會將消息轉發給註冊的Windows客戶端。