示例#1
0
   		private string GetHostnamePort(NetworkHit nh)
   		{
   			if (nh == null) 
   				return null;
   				   		
			string netUri = nh.UriAsString;		
			
			//netbeagle://164.99.153.134:8888/searchToken?http:///....	
			string[] f1, f2 = netUri.Split('?');
			if (f2.Length > 1) {
				f1 = f2[0].Split ('/');
				if (f1.Length > 1)
					return (f1[2]);
			}
			return null;
   		}   		   					
    	public static void DoQueryResponseHandler(IAsyncResult ar) 
    	{   		
    		ReqContext rc = (ReqContext)ar.AsyncState;
    		
			IQueryable 			 iq = rc.GetQueryable;  
    		BeagleWebService 	wsp = rc.GetProxy;  		
    		IQueryResult 	 result = rc.GetResult;
			
			int count = 0;
			//bool hitRejectsLogged = false;
			
    		try
      		{	    		
    			SearchResult resp = wsp.EndBeagleQuery(ar);		

				if ((resp != null) && (resp.numResults > 0))
				{
					if (rc.SearchToken == null)
						rc.SearchToken = resp.searchToken; 
						
					//NetContext nc = new NetContext(wsp, resp.searchToken);						
			   		HitResult[] hres = resp.hitResults;
			   		ArrayList  nwhits = new ArrayList();
		
  					for (int i = 0; i < hres.Length; i++) {
			
						try {	
							HitResult hr = hres[i];
							Hit hit = new NetworkHit();
			
							//[Uri Format] netbeagle://164.99.153.134:8888/searchToken?http:///....	
							if (hr.uri.StartsWith(NetworkedBeagle.BeagleNetPrefix))
								hit.UriAsString = hr.uri;
							else {							
								string[] fragments = hr.uri.Split ('/');
								string hostNamePort = fragments[2];										
								hit.UriAsString = NetworkedBeagle.BeagleNetPrefix + hostNamePort + "/" + resp.searchToken + "?" + hr.uri;		
							}
														
							hit.Type = hr.resourceType;
							hit.MimeType = hr.mimeType;
							hit.Source = "Network";			//hit.Source = hr.source;
							hit.Score = hr.score;
							
							if (hr.properties.Length  > 0)
							foreach (HitProperty hp in hr.properties) {
							
								Property p 		= Property.New(hp.PKey, hp.PVal);
								p.IsMutable 	= hp.IsMutable;
								p.IsSearched 	= hp.IsSearched;
	
								hit.AddProperty(p);
							}
				
							//Add Snippet					
							((NetworkHit)hit).snippet = hr.snippet;
								
							//if (hr.snippet != null) 
								//log.Debug("\nNBH: URI" + i + "=" + hr.uri + "\n     Snippet=" + hr.snippet);
										
							((NetworkHit)hit).context = new NetContext(hr.hashCode);
							  						
							//Add NetBeagleQueryable instance
							hit.SourceObject = iq;
							hit.SourceObjectName = ((NetworkedBeagle)iq).Name; 
						
							nwhits.Add(hit); 

							count++;							
						}
						catch (Exception ex2) {
		 	
							log.Warn ("Exception in NetBeagleHandler: DoQueryResponseHandler() while processing NetworkHit: {0} from {1}\n Reason: {2} ", hres[i].uri, wsp.Hostname + ":" + wsp.Port, ex2.Message);
							//log.Error ("Exception StackTrace: " + ex.StackTrace);
		 				}				
					}  //end for 

					if (nwhits.Count > 0) 
						result.Add (nwhits);
/*				
					if ((! result.Add (nwhits)) && (! hitRejectsLogged)) 
					{
						hitRejectsLogged = true;
						log.Info("NetBeagleHandler: Network Hits rejected by HitRegulator. Too many Hits!");
					}
*/					
					log.Info("NetBeagleHandler: DoQueryResponseHandler() Got {0} result(s) from Index {1} from Networked Beagle at {2}", count, resp.firstResultIndex, wsp.Hostname + ":" + wsp.Port); 		   		
			
					int index = resp.firstResultIndex + resp.numResults;			
					if (index  < resp.totalResults) {
					
						log.Debug("NetBeagleHandler: DoQueryResponseHandler() invoking GetResults with index: " + index);
						
						string searchToken = resp.searchToken;									
						
						GetResultsRequest req = new GetResultsRequest();
						req.startIndex = index;
						req.searchToken = searchToken;						
											
						IAsyncResult ar2;					
						ar2 = wsp.BeginGetResults(req, NetBeagleHandler.DoQueryResponseHandler, rc);						
						
						return;						
					}										
				} //end if
				else {
						if (resp == null)
							log.Warn("NetBeagleHandler: DoQueryResponseHandler() got Null response from EndBeagleQuery() !");
				}					
		 	}
		 	catch (Exception ex) {
		 	
				log.Error ("Exception in NetBeagleHandler: DoQueryResponseHandler() - {0} - for {1} ", ex.Message, wsp.Hostname + ":" + wsp.Port);
		 	}
		 	
		 	//Signal completion of request handling						
			rc.RequestProcessed = true; 
    	}