2009-03-12 9 views
20

원격 악기에 Silverlight 2 사용자 인터페이스를 만들고 있습니다. 계측기와 통신하는 다른 사이트 (계측기 및 원격 과학자의 운영자)와 상호 작용하지 않는 관찰자 사용자가 두 명씩있어보고 있습니다. 그러나 두 명의 활성 사용자 중 한 명이 변경 될 때마다 이러한 변경 사항이 모든 사용자의 UI에 즉각적으로 반영되어야합니다. 이미지를 패닝하거나 확대/축소하거나 이미지의 일부를 주석 또는 선택하고, 목록 상자에 표시된 컬렉션에 항목을 추가 할 수 있습니다. 클라이언트 내에서 나는 해당 사용자가 변경 한 사항을 쉽게 반영하는 관찰 가능 콜렉션을 사용하지만 다른 사용자가 변경 한 사항을보기가 어렵습니다. 각 클라이언트의 변경 사항을 폴링 할 수 있지만 푸시 알림과 같은 것이 더 좋을 것입니다. 나는 광범위하게 예제를 봤지만 아무것도 필요한 것을 찾지 못했습니다. Silverlight가 WCF 서비스와 상호 작용하는 모든 종류의 보안 문제가 있습니다. 이는 많은 잠재적 인 예제가 작동하지 않는다는 것을 의미합니다. 본질적으로이 프로젝트에 시간이 없어서 빨리 도움이 필요합니다. 누구든지이 작업을 수행하는 방법을 보여주는 적절한 간단한 예제에 대한 제안 사항이 있습니까? 나는 경험 많은 개발자이지만 Silverlight 및 WCF 서비스를 직접 가르쳐야하고 내 영역에는 아무 것도 없습니다. 심지어 tho '나는 웹/자바 전문가가 아닌 ASP.NET 작업을 공정하게 수행했습니다. 감사.Silverlight 및 푸시 알림

답변

10

푸시 알림은 새로운 WCF PollingDuplexHttpBinding 지원을 사용하여 실버 (2)에지지된다. 실버 라이트 SDK (one for Silverlight app one for WCF server)에 설치된 두 개의 어셈블리가 있습니다.

나는이 실증하고자 few blog posts and a full sample application 방법 콘솔 응용 프로그램 서버에 '푸시'주식 업데이트가 자기 호스트에 연결된 클라이언트에 WCF 서비스를. 또한 각 클라이언트가 주식에 대해 메모를 추가하고 이러한 메모를 다른 모든 연결된 클라이언트로 동기화 (서버에서 푸시) 할 수있는 방법을 보여줍니다.

using System; 
using System.ServiceModel; 
using System.ServiceModel.Description; 

namespace StockServer 
{ 
    public class StockServiceHost : ServiceHost 
    { 
     public StockServiceHost(object singletonInstance, params Uri[] baseAddresses) 
      : base(singletonInstance, baseAddresses) 
     { 
     } 

     public StockServiceHost(Type serviceType, params Uri[] baseAddresses) 
      : base(serviceType, baseAddresses) 
     { 
     } 

     protected override void InitializeRuntime() 
     { 
      this.AddServiceEndpoint(
       typeof(IPolicyProvider), 
       new WebHttpBinding(), 
       new Uri("http://localhost:10201/")).Behaviors.Add(new WebHttpBehavior()); 

      this.AddServiceEndpoint(
       typeof(IStockService), 
       new PollingDuplexHttpBinding(), 
       new Uri("http://localhost:10201/SilverlightStockService")); 

      this.AddServiceEndpoint(
       typeof(IStockService), 
       new WSDualHttpBinding(WSDualHttpSecurityMode.None), 
       new Uri("http://localhost:10201/WpfStockService")); 

      base.InitializeRuntime(); 
     } 
    } 
} 

WPF 클라이언트는 WSDualHttpBinding 엔드 포인트와 실버 라이트 클라이언트에 연결 :

샘플의 최신 버전 (4 부)는 다음과 같이 두 개의 서버 엔드 포인트를 사용하여 실버 라이트와 WPF 두 클라이언트 사이에 밀어 업데이트를 동기화하는 방법을 보여줍니다 같은 WCF 서비스의 PollingDuplexHttpBinding 끝점에 연결하십시오. 또한이 앱은 Silverlight 클라이언트 액세스 정책 요구 사항을 처리하는 방법을 보여줍니다.

클라이언트 (Silverlight 또는 WPF)는 해당 UI의 주식에 대한 메모를 추가 할 수 있으며 이러한 메모는 서버로 전파되어 다른 모든 클라이언트에 푸시됩니다. 이것은 어느 방향 으로든 의사 소통을 보여 주며 앱에 필요한 모든 의사 소통을 수행하기를 바랍니다.

demo application running here의 스크린 샷을 볼 수 있습니다.

+1

PollingDuplexHttpBinding이 폴링으로 "밀어 넣기"를 구현하지 않으므로 이름이 무엇입니까? – gbjbaanb

+1

COMET 스타일의 오래 지속되는 HTTP 연결을 사용하므로 기술적으로 폴링하지만 폴링 루프가 너무 길기 때문에 (데이터가 없을 때) 콜백을 서버에 등록하는 것과 유사합니다. – luke

6

사실 Flex의 팬클럽에서 Flex를 사용하고있는 것은 아니지만 실제로는 모든 Flex 기반 응용 프로그램에 일상적으로 구축되는 아키텍처입니다.

우리는 세 가지 성분을 가지고이 기능을 달성하기 위해 함께 통합 :

  1. 혜성 패턴 (할 수있는 HTTP 호환 방법을 의심의 여지가 적당 실버 라이트로 번역 할 수 없었다 - 우리가 플렉스에 무엇을 여기에있다 서버 푸시 알림 -
  2. JMS 메시징 주제 (/ 가입자 대기열을 게시)
  3. 어도비의 BlazeDS에 서블릿

) 추가 정보를 원하시면 위키 백과에 보면 후자의 항목은 Comet 패턴을 구현하고 AMF 객체 마샬링 (ActionScript3 객체에 대한 Adobe의 이진 직렬화 형식) 및 JMS 대기열 또는 주제에 대한 브리지를 지원합니다. 주제에 브리징 할 때 브라우저에서 실행중인 여러 Flex 클라이언트를 JMS 항목의 가입자로 프록시 할 수 있습니다. 따라서 어떤 클라이언트가 메시지를 게시하거나 (서버 측 코드가 주제에 게시하는 경우) 모든 클라이언트 가입자는 BlazeDS 및 Comet Pattern 구현을 통해 메시지를 푸시합니다.

효과적으로 BlazeDS가 수행하는 구성 요소를 찾거나 작성해야합니다. 이 서버 측 구성 요소의 Comet 패턴과 상호 작용하는 클라이언트 코드를 구현해야 할 수도 있습니다.

WCF는 Comet Pattern과 양방향 메시징을 지원합니까? 특히 SSL에 대해 HTTP 및 포트 80 또는 포트 443을 준수합니다. 이미 살펴본 것처럼 보이지만 양방향 메시징을 찾지 못한 것 같습니다. 따라서 소매를 감아 서 코딩을해야 할 수도 있습니다.웹 응용 프로그램에 서버 푸시를하는 것에 대해주의해야 할

어떤 것들은 :

블레이즈 DS는 혜성 패턴 구현의 두 가지 기본 모드를 지원 (제 3 폴링 옵션이 실제로 거기를하지만, 그것을 무시하고) :

당신은 대부분의 웹 브라우저에서 더 보편적으로 지원 가능한 것으로 찾아야한다 긴 폴링 한 스트리밍 긴 폴링

  • HTTP. 따라서 초기에 지원하기 위해 합리화 할 수 있습니다. 또는 클라이언트 코드가 HTTP 스트리밍을 먼저 시도하고 필요한 경우 긴 폴링으로 전환하는 데 시간을 할애 할 수 있습니다.

    publish/suscribe 기능을 제공 할 수있는 메시지 브로커에 대해서는 ActiveMQ JMS 사용을 고려할 수 있습니다. 오픈 소스이며 적극적인 커뮤니티 지원으로 무료입니다 (지원을 구매할 수도 있음). 또한 NMS를 사용하여 .NET 클라이언트로 통합 할 수 있습니다.

    중간 계층에 메시지 브로커를 두는 것은 실제로 메시지를 안전하게 배치하기위한 장소이므로 실제로 중요합니다. 클라이언트가 긴 폴링을 수행하는 경우 실제로 연결되어 있지 않은 기간에 새 메시지를 놓치지 않아야합니다.

    트래픽 양이 많은 시나리오 (인터넷상의 웹 사이트와 같이 수천 또는 수천 개의 클라이언트)에서 고려해야 할 또 다른 사항은 확장 가능한 혜성 패턴에 대한 접근 방식이 필요합니다.

    플렉스/자바 세계에서 BlazeDS 서블릿 (오픈 소스)이 비동기 모델에서 작동하도록 수정되었습니다. Java에서는 NIO 채널과 Java Concurrency Executor 스레드 풀을 사용하도록 소켓 수신기를 작성할 수 있습니다. Tomcat 웹 서버에는 NIO 리스너가 있으며 비동기 Servlet 3.0 이벤트를 지원합니다. 하지만 BlazeDS는 특히 Jetty 웹 서버에서 작동하도록 수정되었습니다. 요점은이 비동기식 접근 방식의 확장 성은 하나의 실제 웹 서버가 최대 약 20,000 개의 Comet 스타일 클라이언트 연결을 지원하도록 향상 될 수 있다는 것을 의미합니다.

    은 내가 심각한 .NET 프로그래밍을 수행하지만, 비동기 결과 처리기 기능이있는 경우를 제외하고 많은 자바 1.1 같았 입출력 기능을 사용했습니다 이후 오랜만이야. 그러나 이것은 Java NIO 채널을 통해 비동기 소켓 리스너를 만드는 것과는 다릅니다. NIO 채널 구현은 상대적으로 작은 스레드 풀을 사용하여 수십에서 수천 개의 소켓 연결을 지원할 수 있습니다. 하지만 C#과 .NET은 2 ~ 3 가지 중요한 변화를 겪었습니다. 아마도 NIO 채널에 필적하는 새로운 io 기능이 추가되었을 것입니다.

  • 0

    PollingDuplexHttpBinding이 아마도 가장 우아한 방법 일 것입니다.

    Silverlight 클라이언트에서 TCP 소켓을 사용하는 방법이 있습니다. Silverlight 클라이언트 중 하나가 업데이트를 푸시해야 할 때마다 호출해야하는 WCF 서비스의 이름 또는 기타 경량 정보를 포함하는 TCP 메시지를 보낼 수 있습니다.

    이 방법을 응용 프로그램에 사용하면 잘 작동합니다.

    1

    내 조직에서 Silverlight 2.0/WCF 푸시 구현이 최소한 "우선적으로 준비되지 않았습니다"라는 사실을 발견했습니다.

    XMPP/Jabber는 더 잘 구성된 짐승이기 때문에 결국 인터넷에서 리소스를 가져 와서 Silverlight에서 쉽게 구현할 수 있습니다.

    저는 Silverlight 3.0이 공개적으로 사용 가능한 정보에서 알 수있는 것보다 더 새롭고/더 잘 형성된 푸시 구현을 구현할 것으로 생각합니다.

    당신이 당신의 메시징 미들웨어로 내-채널에서 너바나를 사용할 수 반군 프록시, 교량 또는 웹 서버와 네이티브 실버 API를 원하는 경우 또는

    2

    . My-Channels 및 쇼케이스 사이트에서 Nirvana를 확인하십시오. (미안 새 사용자 오전 링크를 제출하지 못할) :

    알렉스 사이트에

    +0

    실버 라이트로 너바나를 사용하고 있습니다. :) – RhysC

    2

    편집 : 실제로 잘 작동합니다. 나는 심하게 폐쇄 :(

    내가 SL2의 PollingDuplex를 사용에서 "숨겨진 변수"에 물린 나는 아직 생산을위한 준비가 아니라고 생각되었다.

    내 주요 문제는 그것이 '아무튼 사실이다 동일한 컴퓨터에서 클라이언트를 구분하지 못합니다 .2 개의 클라이언트를 실행하면 그 중 하나는 더 이상 서버를 폴링 할 수 없으며 시간 초과로 인해 죽을 것입니다 .2 개의 클라이언트에 대해 다른 SessionId가 있지만 무시됩니다.

    마찬가지로 클라이언트를 죽인 다음 새 클라이언트를 만들면 새 클라이언트는 잠시 이전 클라이언트의 푸시 업데이트를 가져옵니다.

    누구나 동일한 문제가 발생했거나 SL3에서 해결 되었습니까?

    실제로 나는 더 많은 데모 코드를 실행했고 어떤 이유로 서비스가 세션 기반이되고 싱글 톤이 아닐 수 있도록 InstanceContextMode와 InstanceMode를 지정해야한다는 것을 깨달았습니다. 내가 뽑은 간단한 데모 코드에는 명확한 성능 문제가 있습니다.

    이 동작이 문서화되지 않은 것은 매우 불행한 일입니다.

    3

    PollingDuplexHttpBinding이 'true'푸시 알림을 구현하지 않고 그 이름 (폴링)을 표시한다는 것을 분명히 밝히고 싶었습니다.

    서비스가 콜백 채널에 보내려고 새 메시지에 대해이 바인딩, 실버 라이트 클라이언트가 주기적으로 조사 네트워크 계층에서 서비스하고, 검사로 구성하십시오 msdn documentation에서. 서비스는 클라이언트 콜백 채널에서 전송 된 모든 메시지를 대기열에 넣고 클라이언트가 서비스를 폴링 할 때 클라이언트에 전달합니다.

    그러나 각 폴링 이후 서버는 특정 시간 (예 : 1 분) 동안 채널을 열어두고 메시지가 도착할 경우 웹 서비스를 폴링하는 전통적인 방법보다 효율적입니다. 클라이언트에 메시지를 직접 '푸시'합니다. 클라이언트는 서비스를 폴링하기 위해 연결을 반복해서 갱신해야합니다.

    실버 라이트로 실제 푸시 알림을 구현하려는 경우 소켓으로 작업해야한다고 생각하며 주제에 대한 Dan Wahlin의 블로그 게시물을 읽는 것이 좋습니다.