private ServiceType GetClientAccessServiceFromList <ServiceType>(List <DownLevelServerStatusEntry> serverList, ServiceTopology topology, AnchorMailbox anchorMailbox, Site targetSite, ClientAccessType clientAccessType, Predicate <ServiceType> otherFilter, RequestDetailsLogger logger, DownLevelServerManager.DownlevelExchangeServerVersion targetDownlevelExchangeServerVersion) where ServiceType : HttpService { string text = anchorMailbox.ToCookieKey(); int hashCode = HttpProxyBackEndHelper.GetHashCode(text); serverList = this.GetFilteredServerListByVersion(serverList, targetDownlevelExchangeServerVersion); int[] shuffledList = DownLevelServerManager.GetShuffledList(serverList.Count, hashCode); if (ExTraceGlobals.VerboseTracer.IsTraceEnabled(TraceType.DebugTrace)) { ExTraceGlobals.VerboseTracer.TraceDebug <string, int, string>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: HashKey: {0}, HashCode: {1}, Anchor mailbox {2}.", text, hashCode, anchorMailbox.ToString()); } for (int i = 0; i < shuffledList.Length; i++) { int num = shuffledList[i]; DownLevelServerStatusEntry currentServer = serverList[num]; if (ExTraceGlobals.VerboseTracer.IsTraceEnabled(TraceType.DebugTrace)) { ExTraceGlobals.VerboseTracer.TraceDebug <string, int, bool>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: Back end server {0} is selected by current index {1}. IsHealthy = {2}", currentServer.BackEndServer.Fqdn, num, currentServer.IsHealthy); } if (currentServer.IsHealthy) { ServiceType serviceType = topology.FindAny <ServiceType>(clientAccessType, (ServiceType service) => service != null && service.ServerFullyQualifiedDomainName.Equals(currentServer.BackEndServer.Fqdn, StringComparison.OrdinalIgnoreCase) && !service.IsOutOfService && otherFilter(service), "f:\\15.00.1497\\sources\\dev\\cafe\\src\\HttpProxy\\DownLevelServerManager\\DownLevelServerManager.cs", "GetClientAccessServiceFromList", 767); if (serviceType != null) { ExTraceGlobals.VerboseTracer.TraceDebug <Uri, string>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: Found service {0} matching back end server {1}.", serviceType.Url, currentServer.BackEndServer.Fqdn); RequestDetailsLoggerBase <RequestDetailsLogger> .SafeAppendGenericInfo(logger, "DownLevelTargetRandomHashing", string.Format("{0}/{1}", i, serverList.Count)); return(serviceType); } ExTraceGlobals.VerboseTracer.TraceError <string>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: Back end server {0} cannot be found by ServiceDiscovery.", currentServer.BackEndServer.Fqdn); } else { ExTraceGlobals.VerboseTracer.TraceWarning <string>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: Back end server {0} is marked as unhealthy.", currentServer.BackEndServer.Fqdn); } } RequestDetailsLoggerBase <RequestDetailsLogger> .SafeAppendGenericInfo(logger, "DownLevelTargetRandomHashingFailure", string.Format("{0}", serverList.Count)); this.TriggerServerMapRefreshIfNeeded(topology, serverList); string text2 = string.Format("Unable to find proper back end service for {0} in site {1}.", anchorMailbox, targetSite.DistinguishedName); ExTraceGlobals.VerboseTracer.TraceError <string>((long)this.GetHashCode(), "[DownLevelServerManager::GetClientAccessServiceFromList]: {0}", text2); throw new NoAvailableDownLevelBackEndException(text2); }
internal List <DownLevelServerStatusEntry> GetFilteredServerListByVersion(List <DownLevelServerStatusEntry> serverList, DownLevelServerManager.DownlevelExchangeServerVersion serverVersion) { if (ExTraceGlobals.VerboseTracer.IsTraceEnabled(TraceType.DebugTrace)) { ExTraceGlobals.VerboseTracer.TraceDebug <string>((long)this.GetHashCode(), "[DownLevelServerManager::GetFilteredServerListByVersion]: Filtering ServerList by Version: {0}", serverVersion.ToString()); } switch (serverVersion) { case DownLevelServerManager.DownlevelExchangeServerVersion.Exchange2007: return(serverList.FindAll((DownLevelServerStatusEntry server) => server.BackEndServer.Version >= Server.E2007MinVersion && server.BackEndServer.Version < Server.E14MinVersion)); case DownLevelServerManager.DownlevelExchangeServerVersion.Exchange2010: return(serverList.FindAll((DownLevelServerStatusEntry server) => server.BackEndServer.Version >= Server.E14MinVersion && server.BackEndServer.Version < Server.E15MinVersion)); default: return(serverList); } }