2010-05-18 2 views
1

Bonjour, J'ai créé un moteur de balayage Web basé sur un pool de threads simple dans mon application Web. Son travail consiste à explorer son propre espace d'application et à créer un index Lucene de chaque page Web valide et de leur contenu méta. Voici le problème. Lorsque j'exécute le moteur de balayage à partir d'une instance de serveur de débogage de Visual Studio Express et fournissez l'instance de démarrage en tant qu'URL IIS, cela fonctionne correctement. Toutefois, lorsque je ne fournis pas l'instance IIS et qu'il utilise son propre URL pour démarrer le processus d'analyse (c.-à-d. L'exploration de son propre espace de domaine), l'exception d'expiration de l'opération est détectée par l'instruction Webresponse. Quelqu'un pourrait-il me guider dans ce que je devrais ou ne devrais pas faire ici? Voici mon code pour aller chercher la page. Il est exécuté dans l'environnement multithread.Asp.net Crawler Webresponse Opération expirée

private static string GetWebText(string url) 
    { 
     string htmlText = "";   

     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     request.UserAgent = "My Crawler"; 

     using (WebResponse response = request.GetResponse()) 
     { 
      using (Stream stream = response.GetResponseStream()) 
      { 
       using (StreamReader reader = new StreamReader(stream)) 
       { 
        htmlText = reader.ReadToEnd(); 
       } 
      } 
     } 
     return htmlText; 
    } 

Et voici mon stacktrace:

at System.Net.HttpWebRequest.GetResponse() 
    at CSharpCrawler.Crawler.GetWebText(String url) in c:\myAppDev\myApp\site\App_Code\CrawlerLibs\Crawler.cs:line 366 
    at CSharpCrawler.Crawler.CrawlPage(String url, List`1 threadCityList) in c:\myAppDev\myApp\site\App_Code\CrawlerLibs\Crawler.cs:line 105 
    at CSharpCrawler.Crawler.CrawlSiteBuildIndex(String hostUrl, String urlToBeginSearchFrom, List`1 threadCityList) in c:\myAppDev\myApp\site\App_Code\CrawlerLibs\Crawler.cs:line 89 
    at crawler_Default.threadedCrawlSiteBuildIndex(Object threadedCrawlerObj) in c:\myAppDev\myApp\site\crawler\Default.aspx.cs:line 108 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 

Merci et acclamations, Leon.

+0

Peut-être ne trouvez-vous pas l'adresse Web que vous transmettez? Avez-vous vérifié? Si vous passez une adresse qui ne peut pas localiser, alors attendez la connexion pour obtenir le délai. – Aristos

+0

Bonjour Aristos, oui j'ai confirmé que la page que je passe est "navigable". Cependant, comme je l'ai dit, lorsque le robot tourne sur son propre espace serveur, je ne peux pas accéder aux sites sur le serveur. Obtenez un message de 403 trop d'utilisateurs. Mais cela étant dit, ce problème ne se reproduit pas lorsque j'essaie d'exécuter le robot d'exploration pour une autre instance de serveur que la sienne. – Leon

Répondre

0

Combien de demandes simultanées sont effectuées par votre robot d'exploration? Vous pourriez facilement mourir de faim le threadpool - particulièrement pendant que le crawler court dedans le code de site Web.

Chaque demande que votre appel comme celui-ci utilisera 2 threads du pool - un pour traiter la demande et un autre pour attendre la réponse.

+0

Je suis maintenant allée et j'ai essayé de jouer avec des threads max et d'éliminer tout ce que j'utilise avec HttpWebResponse. Pas de chance. Je n'arrive pas à comprendre pourquoi mon robot d'exploration est capable d'explorer le même site à partir du débogueur dans Visual Studio, mais en explorant l'instance IIS; et ne pas être en mesure d'explorer "lui-même", c.-à-d., analyser l'instance de débogage du serveur à partir du débogueur ou l'instance IIS, lorsque le robot d'exploration est exécuté à partir de l'IIS. – Leon