2012-12-06 66 views
1

有公共網站,我想以編程方式檢索一個文檔,通過瀏覽器完成工作,但通過代碼返回「無查詢」。通過httpwebrequest從網站檢索文檔,不會返回任何查詢

任何人都可以檢查出來,我在做什麼錯了,老老實實即時通訊上停留了幾天......

下面是代碼:

string fileUrl = @"http://docsonline.wto.org/imrd/directdoc.asp?DDFDocuments/t/G\SPS\NALB149.doc"; 
      Uri uri = new Uri(fileUrl); 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 

      using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse()) 
      { 

       using (Stream responseStream = webResponse.GetResponseStream()) 
       { 
        if (responseStream != null) 
        { 
         using (MemoryStream memoryStream = new MemoryStream()) 
         { 
          byte[] buffer = new byte[8192]; 
          int bytesRead; 
          while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
          { 
           memoryStream.Write(buffer, 0, bytesRead); 
          } 
          memoryStream.Seek(0, SeekOrigin.Begin); 

          string fileName = fileUrl.Substring(fileUrl.LastIndexOf("/") + 1, fileUrl.Length - fileUrl.LastIndexOf("/") - 1).Replace(@"\", "_"); 

          using (FileStream fileStream = System.IO.File.Create(@"C:\temp\" + fileName, (int)memoryStream.Length)) 
          { 
           // Fill the bytes[] array with the stream data 
           byte[] bytesInStream = new byte[memoryStream.Length]; 
           memoryStream.Read(bytesInStream, 0, (int)memoryStream.Length); 

           // Use FileStream object to write to the specified file 
           fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
          } 
         } 
        } 
       } 
      } 

正如你可以看到有一個鏈接到我想要檢索的文件,任何人都可以嘗試一下嗎?

也許會有比我更幸運...

等待響應

+0

鏈接重定向到登錄頁面。 –

+0

@RichardDeeming,我不能告訴我重定向。 Chrome立即爲我開始下載。 –

+0

然後,您可能已在Chrome中登錄該網站。嘗試與提琴手:http://www.fiddler2.com/fiddler2/ –

回答

1

OK,有兩個問題在這裏:

  1. 你需要一個cookie容器的要求:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
    request.CookieContainer = new CookieContainer(); 
    
  2. 您的路徑包含反斜槓b ŸSystem.Uri班。因此,請求是針對directdoc.asp?DDFDocuments/t/G%5CSPS%5CNALB149.doc進行的,該請求重定向到404錯誤。

要解決#2,您需要將dontEscape參數傳遞給the Uri constructor

Uri uri = new Uri(fileUrl, true); 

此構造已被標記,因爲.NET 2.0爲過時,但它仍然有效。

有了這些更改,您應該能夠成功下載文檔。

+0

哦,非常感謝你,我被困在這個問題上幾天了,我不知道它會怎麼發生!昨天在閱讀你的答案之前,我注意到get URL已經被\ 5C替換爲錯誤,但我不知道如何解決它。順便說一句,有沒有使用thi過時的uri構造函數的方法,但stil有sae效果,因爲基本上不需要uir,但字符串也可以,但是我想它也會改變...... – Alnedru

+0

@Alnedru:不幸的,我不認爲有一種方法可以在不使用過時構造函數的情況下提出請求。 'WebRequest.Create(string)'方法可以有效地調用'Create(new Uri(requestUriString))',這會產生同樣的問題。 –