2013-06-28 11 views
1

내 WCF 서버는 다음과 같이 작동합니다. 서비스 메소드 (예 : 구독)를 호출하여 구독합니다. 그들은 콜백 채널에서 결과를 다시 보냅니다. MessageReceived (문자열 메시지).WCF RoutingService는 클라이언트와 동일한 계약을 맺은 두 대의 서로 다른 WCF 서버의 콜백 메시지를 어떻게 라우트 할 수 있습니까?

내 문제는 현재 하나의 서비스 끝점에서만 콜백 메시지를 받고 있다는 점입니다. 사실, 디버깅을 통해 제 두 번째 서비스가 요청을받지 못한다는 것을 알았습니다. 아무도 문제가 뭔지 알고 있습니까? 여기에 내 코드 (필자는 serviceAddresses 문자열이 net.tcp 주소가 있습니다)입니다 : 그래서 다시 한 번

private void StartAggregatorHost(List<string> serviceAddresses) 
{ 
     // Create a new service host for the routing service (note that RoutingService is a pre-defined Microsoft service model type which routes SOAP messages). 
     aggregatorHost = new ServiceHost(typeof(RoutingService)); 

     // Set up the router address. A logger client will now connect to this address to get logged messages. 
     string fqdn = System.Net.Dns.GetHostEntry("localhost").HostName; 
     string routerAddress = string.Format("net.tcp://{0}:2099/LogAggregator", fqdn); 

     // Set up our router binding. 
     NetTcpBinding routerBinding = new NetTcpBinding(SecurityMode.None, true); 
     routerBinding.SendTimeout = new TimeSpan(0, 1, 0);  
     routerBinding.ReceiveTimeout = new TimeSpan(25, 0, 0); 
     routerBinding.MaxReceivedMessageSize = int.MaxValue; 
     routerBinding.MaxConnections = int.MaxValue; 
     routerBinding.ListenBacklog = int.MaxValue; 
     routerBinding.ReliableSession.Enabled = true; 
     routerBinding.ReliableSession.Ordered = true; 
     routerBinding.ReliableSession.InactivityTimeout = new TimeSpan(15, 0, 0, 0); 

     // Define the type of router in use. For duplex sessions like in our case, we want to use the IDuplexSessionRouter. 
     Type contractType = typeof(IDuplexSessionRouter); 

     // Add the endpoint that the router will use to recieve and relay messages. Note the use of System.ServiceModel.Routing.IDuplexSessionRouter. 
     aggregatorHost.AddServiceEndpoint(contractType, routerBinding, routerAddress); 

     // Create the endpoint list that contains the service endpoints we want to route to. 
     List<ServiceEndpoint> endpointList = new List<ServiceEndpoint>(); 

     foreach (string serverAddress in serviceAddresses) 
     { 
      // Set up our server binding(s) for each server. 
      NetTcpBinding serverBinding = new NetTcpBinding(SecurityMode.None, true); 
      serverBinding.SendTimeout = new TimeSpan(0, 1, 0); 
      serverBinding.ReceiveTimeout = new TimeSpan(25, 0, 0); 
      serverBinding.MaxReceivedMessageSize = int.MaxValue; 
      serverBinding.MaxConnections = 1; 
      serverBinding.ListenBacklog = int.MaxValue; 
      serverBinding.ReliableSession.Enabled = true; 
      serverBinding.ReliableSession.Ordered = true; 
      serverBinding.ReliableSession.InactivityTimeout = new TimeSpan(15, 0, 0, 0); 

      // Create the server endpoint the router will route messages to and from. 
      ContractDescription contract = ContractDescription.GetContract(contractType); 
      ServiceEndpoint server = new ServiceEndpoint(contract, serverBinding, new EndpointAddress(serverAddress)); 

      // Add the server to the list of endpoints. 
      endpointList.Add(server); 
     } 

     // Create a new routing configuration object. 
     RoutingConfiguration routingConfiguration = new RoutingConfiguration(); 

     // Add a MatchAll filter to the Router's filter table. Map it to the endpoint list defined earlier. When a message matches this filter, it will be sent to the endpoint contained in the list. 
     routingConfiguration.FilterTable.Add(new MatchAllMessageFilter(), endpointList); 

     // Attach the behavior to the service host. 
     aggregatorHost.Description.Behaviors.Add(new RoutingBehavior(routingConfiguration)); 

     // Open the service host. 
     aggregatorHost.Open(); 



     m_eventLog.WriteEntry(string.Format("Log aggregator service hosted at {0}.", routerAddress), EventLogEntryType.Information); 

} 

가 ...이 내가 원하는 무엇인가 :

CLIENT ---REQ---> ROUTER ---REQ---> SVC1 
         ---REQ---> SVC2 

CLIENT <---CALLBACK1--- ROUTER <---CALLBACK1--- SVC1 
     <---CALLBACK2---  <---CALLBACK2--- SVC2 

이 무엇 인 I '(나는 두 번째 심지어는 서비스 메소드를 호출하지 않는 것 같습니다 내 라우터에 서비스를 추가하더라도) 받고 있어요 :

CLIENT ---REQ---> ROUTER ---REQ---> SVC1 

CLIENT <---CALLBACK--- ROUTER <---CALLBACK--- SVC1 
+1

확인할 수있는 몇 가지 사항 : - 수동으로 호출 할 때 SVC1 및 SVC2가 올바르게 실행됩니까? - 목록을 추가하는 대신 하나씩 서비스 끝점을 추가해보십시오. - FilterTable에 추가 할 때 우선 순위 지정 시도 (SVC1 및 SVC2 모두에 대해 동일한 우선 순위) - XML ​​라우팅 구성 파일을 먼저 사용하려고합니다. 코드로 전환하여 작동합니다. – MaxSC

+0

@ MaxS-Betclic - 답변으로 게시하십시오. 지금 당장 당신은 영웅입니다. 제가 누락 된 것이 우선이었습니다. 목록에 전달하면 우선 순위가 자동으로 생성되므로 각 서비스를 개별적으로 추가하고 우선 순위를 지정해야합니다. routingConfiguration.FilterTable.Add (새 MatchAllMessageFilter(), 새 List {yourService}, 1); – Alexandru

+0

당신을 환영합니다! – MaxSC

답변

1

당신은 FilterTable에 SVC1 & SVC2을 추가 특정 우선 순위를 설정해야합니다.

routingConfiguration.FilterTable.Add(new MatchAllMessageFilter(), new List<YourServiceType> { yourService }, 1); 

추가 정보 here.