내 WCF 서비스는 다음과 같이 작동합니다. 서비스 메소드를 호출하여 가입합니다 (예 : 구독()). 그들은 콜백 채널에서 결과를 다시 보냅니다. MessageReceived (문자열 메시지). 내 문제는 지금 내 라우터가 끝점 목록에서 첫 번째 구독 호출을 첫 번째 서비스로 라우팅하는 것입니다. 결과적으로 한 서비스 끝점에서만 콜백 메시지를 가져오고 둘 다 가져 오는 것은 아닙니다. 두 끝점 모두에 가입하고 두 끝점에서 콜백을 받으려고합니다. 여기에 내 코드 (필자는 serviceAddresses 문자열이 net.tcp 주소가 있습니다)입니다 : 그래서 다시 한 번일대 다 시나리오에서 IDuplexSessionRouter를 사용하려면 어떻게해야합니까?
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
이 문제가 어떻게됩니까? 내가 보았던 모든 예에서 이것이 작동해야한다. 나는 내 서버 주소가 정확한지 알고있다. 항상 사용 가능한 첫 번째 주소를 선택한다. – Alexandru
[IDesign의 publish/subscribe 프레임 워크] (http://idesign.net/Downloads/GetDownload/1897)를 살펴보십시오. –
@ PetarVučetin -이 프레임 워크는 RoutingService를 사용하지 않습니다. – Alexandru