Кто-нибудь знает о каком-либо хорошем 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 );
}
Две приращенные переменные должны убедиться, что оба числа равны, и во многихбывает, что это не так, и я получаю бесконечный цикл.