2012-07-27 2 views
0

그래서 클라이언트 응용 프로그램과 WCF 서비스가 IIS 서버에 게시됩니다. 클라이언트를 WCF 서비스에 가입시킨 다음 클라이언트 중 하나에서 버튼을 클릭 한 후 클라이언트 응용 프로그램의 각 인스턴스에 메시지를 전달할 수있었습니다. 이제는 내 목표는 WCF 응용 프로그램에서 메시지를 밀어내는 것이지만 웹 브라우저에서 REST를 통해 Android에서이 인터페이스를 사용하고 Android 클라이언트와 Windows 클라이언트 응용 프로그램간에 상호 작용할 수있게하는 것입니다. 누구든지 내가해야 할 일이 뭔지 알아? 다음은 내가 작업 한 인터페이스의 기본 사항입니다.REST를 사용하여 WCF 콜백 노출

IService.vb : HTTP에서

<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

일반적으로 기반 밀어 구현은 매우 어렵다. 이것을 구현하는 데 사용되는 일반적인 기술은 역방향 Ajax, 웹 소켓 또는 긴 폴링입니다 (소켓을 영구적으로 열어두기 위해 단일 픽셀 플렉스 객체를 사용하는 경우도 있음). Reverse Ajax aka Commet을 사용하여 푸시 알림 기능이있는 wcf rest 서비스를 구현하는 Code Project Article을 확인하십시오.

+0

그래서 안드로이드 장치에 대한 WCF 서비스의 응답이 필요하지 않더라도, 그 일은 그리 간단하지 않습니다. HTTP에서 이벤트를 트리거하여 콜백이 WPF 클라이언트로 푸시되도록하므로 아무 것도 HTTP를 통해 다시 전송되지 않습니다. 이 사실을 완전히 이해하고 있는지 확인하고 싶습니다. 감사. – bflosabre91

+0

나는 당신의 질문을 완전히받지 못했습니다. 당신이 해결하려고하는 문제를 설명해 주시겠습니까 – Anand

+0

내 WCF 서비스에서 콜백이 클라이언트 응용 프로그램의 열려있는 인스턴스에서 시작되면 작동하는 콜백을 구독하는 Windows 클라이언트 응용 프로그램이 있습니다. 하지만 콜백 대신 Windows 클라이언트와 상호 작용하는 일종의 열린 클라이언트 응용 프로그램에 보내지고, 이드는 콜백 서비스가 Windows 클라이언트에 안드로이드 클라이언트에서 메시지를 보내고 싶어합니다. 나는 그렇게 설정하기를 바랬습니다. 내가 REST.So ID와 함께이 일을 할 수있을 것입니다 WCF 서비스에 http://myservice.com/service1.svc/sendtoclient/test에 가서 "테스트"클라이언트에 보낼 수있는 능력을 추가하려면 . – bflosabre91

0

Android 장치에서 wcf 서비스로 메시지를 보내야 wcf 서비스가 메시지를 등록 된 Windows 클라이언트로 전달합니다.