2011-01-05 2 views
1

Кто-нибудь знает о любом хорошем API проверки ссылок. Я не ищу ни одного искателя веб-страниц, просто что-то, чтобы проверить полную страницу или отдельные ссылки. Я искал его, потому что у меня проблемы с минами, которые я не могу решить на данный момент.API проверки подлинности .NET Link?

Некоторые из основных проблем являются:

  • Некоторые асинхронной веб-запросы никогда не заканчивается
  • Как много ложных срабатываний
  • Получение 404, когда это редирект

Я буду отправьте мой код в случае.

Первый способ, чтобы начать проверки достоверности

private void urlCheck(Link strUri) 
{ 
    try 
    { 
     Uri uri = new Uri(strUri.URL , 
      (strUri.URL.StartsWith("/")) ? 
       UriKind.Relative : UriKind.Absolute); 

     if(!uri.IsAbsoluteUri) 
      uri = new Uri(_page.HttpDomain + uri); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "GET"; 
     request.UserAgent = 
      "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0)"; 
     request.AllowAutoRedirect = true; 
     request.AllowWriteStreamBuffering = true; 
     request.SendChunked = true; 
     request.UnsafeAuthenticatedConnectionSharing = true; 
     request.KeepAlive = false; 
     request.Referer = "http://www.google.ca/"; 
     // default : WebRequest.DefaultWebProxy 
     request.Proxy = null; 
     request.Timeout = 20000; 

     //do not revalidate this 
     WebPageCollection.DoNotRevalidateLinks.Add(strUri); 
     request.BeginGetResponse(new AsyncCallback(getResponseCallback) , 
      request); 
     _webRequest++; 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(ex.StackTrace); 
    } 
} 

Второй метод обратного вызова

private void getResponseCallback(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    string strUri = request.Address.ToString(); 

    Link href = new Link(strUri); 
    href.URLKind = urlKind; 
    href.URLType = UrlType.External; 
    href.URLState = UrlState.Valid; 

    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     if(response.StatusCode == HttpStatusCode.Redirect) 
     { 
      //TODO: Redirects 
      href.URLState = UrlState.Redirect; 
     } 
    } 
    catch(WebException wex) 
    { 
     href.URLState = UrlState.Broken; 
    } 

    _page.Links.Add(href); 
    _webRequestComplete++; 
    request.EndGetResponse(result); 
} 

Две инкрементируется переменные, чтобы убедиться, что оба подсчетов равны, и во многих случаях они нет, и я заканчиваю бесконечным циклом.

+2

Необходимо больше узнать о ваших проблемах. Для первого (async никогда не возвращается), это легко исправить, иметь таймаут и предположить после этого таймаута, что он недействителен, если он не возвращается. Для ложных срабатываний вам нужно точно определить, что является ложным положительным. Для 404s, которые перенаправляются, я не понимаю, как вы можете это получить, либо получите ответ 301/302, либо нет. Вам нужно подробнее рассказать о хорошем ответе. – casperOne

+0

Не возвращаясь, я имею в виду, что это событие никогда не поднимается, мой метод делегата никогда не пострадает, даже если у меня есть временная задержка на моем веб-запросе. Полагаю, он должен хотя бы вернуть мне ответ с тайм-аутом. Но его нет. По ложным позициям я имею в виду, либо страница, заявленная как сломанная, когда ее перенаправление, или страница, заявленная как сломанная (404), но ее действительная действительность. Дайте мне знать, если вам нужна дополнительная информация. –

ответ

0

Есть ли причина, по которой вы устанавливаете SendChunked? Для меня большую часть времени выбрасывает ProtocolViolationException. Измените оператор catch в вашем методе urlCheck(), чтобы повторно выбросить ошибку, чтобы увидеть ее.

UPDATE

Извините держать ковкой точку, но я думаю, что вы теряете эту ошибку. Похоже, вы делаете это на странице ASPX (вы упомянули web.config), но вы используете Console.Write в своем catch, чтобы вы никогда не видели его. According to MSDN, ProtocolViolationException будет сгенерировано, когда:

Метод GET или HEAD, и либо ContentLength больше нуля или SendChunked верно.

+0

Я не получаю никакой ошибки, брошенной в этот момент. Я написал это некоторое время назад, но если я помню, я должен был добавить некоторые вещи в webconfig, чтобы заставить его работать. –

+0

Важно отметить, что это многопоточное приложение. –

+0

Я обновил свой пост выше. –

Смежные вопросы