2012-05-11 1 views
0

イムこれはクラスでブレークポイントを使用していますが、クラスの最初の行に取得することはありません

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using HtmlAgilityPack; 
using System.Net; 

namespace GatherLinks 
{ 
    /// <summary> 
    /// A result encapsulating the Url and the HtmlDocument 
    /// </summary> 
    class WebPage 
    { 
     public Uri Url { get; set; } 

     /// <summary> 
     /// Get every WebPage.Internal on a web site (or part of a web site) visiting all internal links just once 
     /// plus every external page (or other Url) linked to the web site as a WebPage.External 
     /// </summary> 
     /// <remarks> 
     /// Use .OfType WebPage.Internal to get just the internal ones if that's what you want 
     /// </remarks> 
     public static IEnumerable<WebPage> GetAllPagesUnder(Uri urlRoot) 
     { 
      var queue = new Queue<Uri>(); 
      var allSiteUrls = new HashSet<Uri>(); 

      queue.Enqueue(urlRoot); 
      allSiteUrls.Add(urlRoot); 

      while (queue.Count > 0) 
      { 
       Uri url = queue.Dequeue(); 

       HttpWebRequest oReq = (HttpWebRequest)WebRequest.Create(url); 
       oReq.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"; 

       HttpWebResponse resp = (HttpWebResponse)oReq.GetResponse(); 

       WebPage result; 

       if (resp.ContentType.StartsWith("text/html", StringComparison.InvariantCultureIgnoreCase)) 
       { 
        HtmlDocument doc = new HtmlDocument(); 
        try 
        { 
         var resultStream = resp.GetResponseStream(); 
         doc.Load(resultStream); // The HtmlAgilityPack 
         result = new Internal() { Url = url, HtmlDocument = doc }; 
        } 
        catch (System.Net.WebException ex) 
        { 
         result = new WebPage.Error() { Url = url, Exception = ex }; 
        } 
        catch (Exception ex) 
        { 
         ex.Data.Add("Url", url); // Annotate the exception with the Url 
         throw; 
        } 

        // Success, hand off the page 
        yield return new WebPage.Internal() { Url = url, HtmlDocument = doc }; 

        // And and now queue up all the links on this page 
        foreach (HtmlNode link in doc.DocumentNode.SelectNodes(@"//a[@href]")) 
        { 
         HtmlAttribute att = link.Attributes["href"]; 
         if (att == null) continue; 
         string href = att.Value; 
         if (href.StartsWith("javascript", StringComparison.InvariantCultureIgnoreCase)) continue;  // ignore javascript on buttons using a tags 

         Uri urlNext = new Uri(href, UriKind.RelativeOrAbsolute); 

         // Make it absolute if it's relative 
         if (!urlNext.IsAbsoluteUri) 
         { 
          urlNext = new Uri(urlRoot, urlNext); 
         } 

         if (!allSiteUrls.Contains(urlNext)) 
         { 
          allSiteUrls.Add(urlNext);    // keep track of every page we've handed off 

          if (urlRoot.IsBaseOf(urlNext)) 
          { 
           queue.Enqueue(urlNext); 
          } 
          else 
          { 
           yield return new WebPage.External() { Url = urlNext }; 
          } 
         } 
        } 
       } 
      } 
     } 

     ///// <summary> 
     ///// In the future might provide all the images too?? 
     ///// </summary> 
     //public class Image : WebPage 
     //{ 
     //} 

     /// <summary> 
     /// Error loading page 
     /// </summary> 
     public class Error : WebPage 
     { 
      public int HttpResult { get; set; } 
      public Exception Exception { get; set; } 
     } 

     /// <summary> 
     /// External page - not followed 
     /// </summary> 
     /// <remarks> 
     /// No body - go load it yourself 
     /// </remarks> 
     public class External : WebPage 
     { 
     } 

     /// <summary> 
     /// Internal page 
     /// </summary> 
     public class Internal : WebPage 
     { 
      /// <summary> 
      /// For internal pages we load the document for you 
      /// </summary> 
      public virtual HtmlDocument HtmlDocument { get; internal set; } 
     } 
    } 
} 

それは、このラインに停止することはありません:

public Uri Url { get; set; } 

、決して他で停止このクラスの行行を削除した場合のみ:

public Uri Url { get; set; } 

他の行で停止します。しかし、私はそれがなぜ最初の行で停止するのか分からないのですか?どうすれば修正できますか?

私は自動プロパティについては読んでいませんでしたが、私はそれが何であるかを理解していませんでした。私はこのクラスで使用したくありませんでした。

+1

ブレークポイントは、メソッド内のコードでのみ停止します。 –

答えて

1

ブレークポイントはnot supported,auto-implemented propertiesです。 GetAllPagesUnderメソッドの最初の行に設定してみてください。

+0

@AndrasZoltan - 私は継承クラスを見逃しました。ありがとう。 – Oded

+0

ええ、驚くことではありません、見ることがたくさんあります:) –

+0

@AndrasZoltan - heh。初めて私は[スタックオーバーフローはすべてを読むつもりはない](http://meta.stackexchange.com/a/129787/140505)... – Oded

0

それはあなたの質問から非常にあいまいだ - しかし、私はどこかにあなたのプログラムの中であなたが呼んでいることを予感している:

var results = WebPage.GetAllPagesUnder([some uri]); 
をそして、あなたが期待しているが、そのメソッドが呼び出されたときにヒットするようにブレークポイント?

これは、列挙子を生成しません。コードは実際には何もしませんforeachまで列挙可能です。またはToArrayToListまたは類似のものを介して熱心に負荷をかけます。

自動プロパティでは、そのプロパティを設定しているコードをブレークポイントするだけで、ブレークポイントをブレークポイントにすることはできません。 が本当にになりたい場合は、プライベートバッキングフィールドをスティックし、プロパティを手動で実装します。それに失敗した場合は、クラスにUriを持つコンストラクタを与え、それを設定します。

1

このクラスを宣言する場所にブレークポイントを追加します。

WebPage wp =new WebPage(); 

上記のAsifと同じように、宣言では止まりません。

か後には、あなたは

wp.Url="blahblahblah.html"; 

EDIT変数のURLを設定し、クラスを宣言:私は自動プロパティに動作していないブレークポイントを知りませんでした。あなたがここでやっていることは

使用は

Url="blahblahblah"; 

あるプライベート変数名_urlを作成し、プロパティのURLでそれにアクセスしている

private Uri _Url=new Uri(); 
public Url URL{get{return _Url;}set{_Url = value;}} 

にご

public Uri Url{get;set;} 

を変更 現在使用しているのと同じです

0

Urlプロパティには、described hereのようにブレークポイントを設定できます。

ブレークポイントを設定する標準的な方法は、自動プロパティでは機能しません。

関連する問題