Кто-нибудь знает о любом хорошем 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);
}
Две инкрементируется переменные, чтобы убедиться, что оба подсчетов равны, и во многих случаях они нет, и я заканчиваю бесконечным циклом.
Необходимо больше узнать о ваших проблемах. Для первого (async никогда не возвращается), это легко исправить, иметь таймаут и предположить после этого таймаута, что он недействителен, если он не возвращается. Для ложных срабатываний вам нужно точно определить, что является ложным положительным. Для 404s, которые перенаправляются, я не понимаю, как вы можете это получить, либо получите ответ 301/302, либо нет. Вам нужно подробнее рассказать о хорошем ответе. – casperOne
Не возвращаясь, я имею в виду, что это событие никогда не поднимается, мой метод делегата никогда не пострадает, даже если у меня есть временная задержка на моем веб-запросе. Полагаю, он должен хотя бы вернуть мне ответ с тайм-аутом. Но его нет. По ложным позициям я имею в виду, либо страница, заявленная как сломанная, когда ее перенаправление, или страница, заявленная как сломанная (404), но ее действительная действительность. Дайте мне знать, если вам нужна дополнительная информация. –