2010-11-16 74 views
-2

我有一個函數可以從各種網頁資源中提取URL。不用說,有些是完全有效的URL,有些是相對於頁面的HTML而言的。下面是我的asp.net/c#邏輯我派生用於檢查的URL,然後生成一個完全可用的網址從什麼拉從網站...用於修復相關網址到完整網址的asp.net邏輯

我有沒有看過這段代碼在一段時間,但我記得它幾個月前運行良好,現在需要很多調整才能運行 - 尤其是在相對路徑以及從各種相對變化中重新生成完整網址時。

有沒有比我在這裏更簡單的方法或方法來完成這個看似路由的樣板任務?

注: origianlurl是第一個搜索頁面的完整URL,並且relativeUrl是搜索頁面中發現了一個網址(也可以是一個完整的www.site.com或/contactus.html)

private string ResolveRelativePaths(string relativeUrl, string originatingUrl) 
    { 
     if (relativeUrl.StartsWith("http") || relativeUrl.StartsWith("www")) 
      return relativeUrl; 

     if (relativeUrl.StartsWith("/")) 
     { 
      //get main url something.com 
      Uri myURI = new Uri(originatingUrl); 

      //add the relative page to the end 
      return myURI.Host + relativeUrl; 
     } 

     string resolvedUrl = String.Empty; 

     string[] relativeUrlArray = relativeUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
     string[] originatingUrlElements = originatingUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
     int indexOfFirstNonRelativePathElement = 0; 
     for (int i = 0; i <= relativeUrlArray.Length - 1; i++) 
     { 
      if (relativeUrlArray[i] != "..") 
      { 
       indexOfFirstNonRelativePathElement = i; 
       break; 
      } 
     } 

     int countOfOriginatingUrlElementsToUse = originatingUrlElements.Length - indexOfFirstNonRelativePathElement - 1; 
     //for (int i = 0; i <= countOfOriginatingUrlElementsToUse - 1; i++) 
     for (int i = 0; i <= countOfOriginatingUrlElementsToUse ; i++) 
     { 
      if (originatingUrlElements[i] == "http:" || originatingUrlElements[i] == "https:") 
       resolvedUrl += originatingUrlElements[i] + "//"; 
      else 
       resolvedUrl += originatingUrlElements[i] + "/"; 
     } 

     for (int i = 0; i <= relativeUrlArray.Length - 1; i++) 
     { 
      if (i >= indexOfFirstNonRelativePathElement) 
      { 
       resolvedUrl += relativeUrlArray[i]; 

       if (i < relativeUrlArray.Length - 1) 
        resolvedUrl += "/"; 
      } 
     } 

     return resolvedUrl; 
    } 
+0

爲什麼投下這個問題呢? – kacalapy 2010-11-17 15:43:59

回答

1

Uri類有一個constructor,您可以使用它。給定一個基本URI,這是你的originatingUrl和一個字符串(相對部分),它會生成完整的URL。據我所見,在你的方法中沒有一件事情不能使用Uri類(也許是幾個例子)完成。我的猜測是你可以將它改寫成5-10 LOC。

+0

我使用的uri類,我可以但你永遠不知道你會從網上拉下來。因爲有這麼多的變量,這個自定義代碼似乎更適合處理所有的變化。我擔心烏里班會拋出左右錯誤。 – kacalapy 2010-11-16 22:37:29

+1

@ kacalapy:你害怕它會*?你甚至沒有嘗試自動假設你可以編寫比框架中更好的功能。 Uri類有一個'TryCreate'方法,如果失敗則返回false。這並不是左右搖晃的錯誤。我100%相信'Uri'類更健壯,處理比你的代碼更多的特殊情況。 – 2010-11-16 22:42:35

+0

我確實嘗試過,這就是爲什麼我用另一種方式去做這個...我在樣本的頂部使用了uri calss,可以詳細介紹TryCreate的用法,我似乎沒有這樣做過。也原來的代碼是.net 2.0現在我把它全部移植到.net 4.0 – kacalapy 2010-11-16 22:45:28