2016-10-11 24 views
0

내 상황은 다음과 같습니다. Firebird 데이터베이스, WCF REST 서비스 (.NET 4.5) 및 Windows Mobile 6 클라이언트가 있습니다. 내가 필요한 것은 Firebirds post 이벤트에서 WCF REST가 클라이언트에게 알려야합니다.WCF REST 서비스 및 클라이언트 알림

SOAP 서비스로 사용할 때 WCF에 양방향 통신이 있음을 알고 있지만 프레임 워크 버전 비 호환성으로 인해 사용할 수 없습니다. 어떤 아이디어? 이것이 가능한가? 그렇지 않다면 대안이 있는가? 저는 WCF를 처음 접해 보았습니다. 그래서 아마도 뭔가 빠졌을 것입니다.하지만 제 상황에 도움이되는 것을 찾을 수 없었습니다.

P.S 내 서비스의 코드 스 니펫이 필요하면 알려주십시오. 그것의 많은 것이 있고 나는이 포스트를되도록 청결한 유지하는 것을 시도하고있다.

답변

0

휴식 서비스 개발을 위해 WCF에서 ASP.NET Web API 2을 사용하고 SignalR을 사용합니다.

Fire API가 이벤트를 게시 할 때 웹 API는 REST 웹 서비스 용이며 SignalR은 모든 클라이언트에게 알립니다.

SignalR은 서버와 클라이언트 간의 양방향 통신을 허용합니다.

샘플 허브 :

public class SomeHub: Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.broadcastMessage(name, message); 
    } 
} 
+0

SingalR의 클라이언트가 Windows .net CE에서 지원되지 않기 때문에 이것은 나에게 도움이되지 않습니다. 앞으로의 프로젝트에도 유용한 제안이긴하지만. – Aleksandar

0

나는 해결책을 발견,하지만 난 그것이 얼마나 좋은 완전히 확실하지 않다. 먼저 내가

인터페이스 선언을 이벤트에 "구독"하는 데 사용됩니다 WCF의 방법을 만들어

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

내가 post_event가 발생할 때까지 서비스 인스턴스를 동결 AutoResetEvent를 사용하고

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)); 
} 

서비스 클래스 구현 일단 AutoResetEvent의 Set() 메서드가 호출되어 서비스의 고정을 해제하고 내 사건 이름을 반환하면 어떤 이벤트가 발생했는지 알 수 있습니다. 클라이언트 측에서 별도의 스레드에서이 메서드를 호출하고 해당 응답을 기다리는 즉시 해당 메서드를 다시 처리하고 동일한 메서드 요청을 다시 보내서 다음 post_event를 catch 할 수 있습니다.

P. 이 작업을 수행하려면 InstanceContextMode를 PerCall로 설정해야합니다.