2011-01-05 4 views
1

良いリンク検証APIを知っている人はいませんか?私はどのような種類のWebクローラーも探しているわけではなく、完全なページまたは単一のリンクを検証するだけのものです。私は現時点では解決できない鉱山でいくつかの問題を抱えているので、私は1つを探してきました。.NET Link Validator API?

主要な問題のいくつかは以下のとおりです。

  • いくつかの非同期Webリクエストは、それがリダイレクト

I'LLだ時に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); 
        } 
    } 
    

    第2の方法は、2つのインクリメント変数がカウントの両方が対等であることを確認し、そして多くの場合になっているコールバック

    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

    問題の詳細を指定する必要があります。最初の(非同期が返ってこない)場合は、修正するのは簡単ですが、タイムアウトしてからタイムアウトした後に戻ってこない場合は無効とみなします。偽陽性については、偽陽性が何であるかを正確に特定する必要があります。リダイレクトされている404については、301/302の応答を得るか、そうでないかを理解する方法がわかりません。あなたは良い答えを得るためにもっと精緻化する必要があります。 – casperOne

    +0

    私は、私のWeb要求でタイムアウトの遅延があっても、私のデリゲートメソッドは決して上がらないことを意味します。私は、少なくとも私はタイムアウトコードで応答を返す必要がありますと信じています。しかし、そうではありません。偽陽性とは、リダイレクトやページが壊れている(404)と記述されているが、実際には有効であると断言されたページのことです。あなたがより多くの情報を必要とするかどうか私に教えてください。 –

    答えて

    0

    SendChunkedを設定する理由はありますか?それはほとんど私のためにProtocolViolationExceptionを投げます。 urlCheck()メソッドのcatchステートメントを変更して、エラーを再スローして参照してください。

    ポイントを打っして申し訳ありませんが、私はあなたがエラーを失っていると思います

    UPDATE。あなたがASPXページ(web.configに言及した)でこれをやっているように聞こえますが、あなたは見たことがないようにConsole.Writeをキャッチで使用しています。 According to MSDNProtocolViolationExceptionをしたときにスローされます。

    メソッドはGETまたはHEADで、どちらかん。ContentLengthはゼロよりも大きいかSendChunkedが真です。

    +0

    その時点で何のエラーも発生していません。しばらく前に書きましたが、私が正しく覚えていれば、webconfigにいくつかのものを加えて動作させる必要がありました。 –

    +0

    重要なことは、マルチスレッドアプリケーションだということです。 –

    +0

    私は上記の投稿を更新しました。 –