2009-02-03 2 views
2

이중 TCP 연결을 허용하는 WCF 채팅 서비스가 있습니다. 단일 이중 tcp 연결을 사용하여 둘 이상의 사용자에 대한 메시지를 보내고받을 수 있습니다 (따라서 모든 사용자가 서로 연결되는 여러 채팅 서버를 가질 수 있습니다).ASP.Net을 Wcf/Tcp 채팅 서비스에 연결

이제 웹 사용자를 믹스에 추가하여 데스크톱 사용자와 채팅 할 수있게하려고합니다. 이것은 라이브 지원 유형의 것입니다. 기본적으로 ASP.Net에서 "out of band"통신을 수행하는 가장 좋은 방법을이 채팅 서비스에서 찾으려고합니다.

나는 채팅 서버 중 하나에 정적/글로벌 이중 연결을 할 수 있다고 생각하고 ASP.Net 서버에 대한 모든 요청에 ​​사용할 수 있다고 생각했습니다. 이게 효과가 있니? 이중 연결은 모든 단방향 호출이며,이 WCF 채널을 잠그지 않고도 사용할 수 있습니까?

업데이트 : 지금까지 의견을 보내 주셔서 감사합니다. 내가 알아야 할 점은 : 채팅 서비스가 자체 호스팅되어 IIS에서 실행되고 있지 않다는 것입니다. 따라서 저는 주로 응용 프로그램이 언로드 될 때까지 IIS가 연결을 유지하도록하는 방법에 관심이 있습니다. 웹 브라우저에서 IIS 로의 연결은 실버 라이트, 플래시, 아약스, iframe 등입니다.

답변

1

가장 좋은 방법은 앱 수준에서 양방향 메시지 대기열을 구현하고 사용자가 메시지에 색인을 생성하며 세션 식별자를 사용하는 것입니다. 그럼 당신은 응용 프로그램 수준 WCF 서비스 (일명 피어) 팝업 및 대기 개체를 기반으로 푸시 할 수 있습니다. 대기열에 대한 액세스는 잠글 필요가 있지만 상대적으로 저렴한 비용입니다. WCF 서비스는 무거운 짐을 다할 것입니다. 하지만 어떤 시점에서 메시지를 보내는 데 프록시가 하나만 사용되는 경우 앱에 병목 현상이 발생할 것으로 예상됩니다. 세션 당 전용 채널 프록시를 사용하는 것이 더 효율적이어서 상황을 덜 안정적으로 유지할 수 있습니다. 모든 메시지는 단방향으로 작동하기 때문에 비 양방향 연결도 허용합니다.

+0

네 말이 맞아. 듀플렉스 서비스에 대한 연결마다 양방향 메시지 큐 또는 두 개의 개별 메시지 큐를 수행해야합니다. 또한 ReaderWriterLockSlim을 사용하여 wcfDuplexClients의 POOL을 성장 및 축소하고 정적/전역 컬렉션에 저장하는 것을 고려했습니다. –

+0

풀의 각 wcfDuplexClient는 자신의 in/out 메시지 큐를 가질 수 있습니다. 그래서, 나는 ReaderWriterLockSlim을 읽거나, wcfDuplexClient를 잡고, (wcfDuplexClient.sendLock) {wcfDuplexClient.Send (myCommand); } 등 –

+0

세션 당 전용 채널에 대해 계속 생각해보십시오. 그것은 아직 최선의 방법 일 수 있습니다. –

0

이 질문에 대한 답변을 얻지는 못했지만 실버 라이트가이를 수행하고 데스크톱 버전과 유사한 코드를 사용할 수 있습니다.

+0

고마워, 나는 그 부분에 도착하기 위해 기다릴 수없는 실버 라이트 클라이언트를 할 계획이다 :) –

0

웹 사용자가 탐색 할 수있는 ASP.NET 페이지의 일부로 Silverlight 2 응용 프로그램을 제공하는 것이 좋습니다.

이 Silverlight 응용 프로그램은 Silverlight 2 SDK와 함께 제공되는 System.ServiceModel.PollingDuplex.dll 어셈블리 (one for Silverlight app one for WCF server)의 WCF Polling Duplex 지원을 사용할 수 있습니다.

나는이 두 엔드 포인트와 자기 호스트 WCF 서비스는 다음과 같이하는 콘솔 응용 프로그램에서 어떻게 '푸시'주식 업데이트를 실증하고자 few blog posts and a sample application :

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 엔드 포인트와 실버 라이트에 연결 클라이언트는 동일한 WCF 서비스의 PollingDuplexHttpBinding 끝점에 연결합니다. 또한이 앱은 Silverlight 클라이언트 액세스 정책 요구 사항을 처리하는 방법을 보여줍니다.

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

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

+0

내가 끝나기 전에 확실히 실버 라이트 클라이언트를 만들 예정이지만, 클라이언트에서 IIS로.웹 사용자 당 wcf ​​연결없이 IIS를 자체 호스팅 서비스에 연결하는 최상의 솔루션을 찾는 데 어려움을 겪고 있습니다. –

+0

나는 당신이 지금 무엇을 얻고 있는지 당신이 질문을 업데이트했는지 안다. 서버 측은 Silverlight 폴링 이중화가있는 IIS 일 필요는 없습니다. –