API валидатора .NET Link? - PullRequest
       12

API валидатора .NET Link?

1 голос
/ 05 января 2011

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

Вот несколько основных проблем:

  • Некоторые асинхронные сетизапросы никогда не заканчиваются
  • Получение множества ложных срабатываний
  • Получение 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 );
}

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

1 Ответ

0 голосов
/ 05 января 2011

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

UPDATE

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

Метод - GET или HEAD, и ContentLength больше нуля, или SendChunked имеет значение true.

...