2013-02-22 53 views
1

我有兩臺服務器。一個是私人服務器,我不希望用戶直接訪問它,另一個是公共訪問的服務器。 我可以通過URL訪問我的私人服務器,如:http://xxx.xx.xxx.xxx/檢索網站內容並將其返回到ASP.NET MVC 4

我想要做的是創建某種「代理」,只與我的私人服務器一起工作。我的想法是去:http://www.domain.com/server/path/here/something 本頁面應該顯示我,我有這方面的工作了的http://xxx.xx.xxx.xxx/path/here/something

的內容,但我可以使它工作的唯一辦法是返回的內容作爲一個字符串,然後瀏覽器將解釋HTML。 這適用於返回HTML內容的頁面,但它不起作用(當然),如果我想直接訪問.gif或任何類型的文件。

下面的代碼我目前有:

public string Index(string url) 
    { 
     string uri = "http://xxx.xx.xxx.xxx/" + url; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "GET"; 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     StreamReader responseStream = new StreamReader(response.GetResponseStream()); 

     string resultado = responseStream.ReadToEnd(); 

     return resultado; 
    } 

我怎樣才能改變我的代碼,以便它可以用於任何文件?

+1

你不能用一個真正的代理來實現這個嗎? – marcoaoteixeira 2013-02-22 19:16:32

+0

我不知道是否有更好的方法來做到這一點。 我只想從我的私人服務器獲取內容(通過使用我之前解釋的URL),並將其顯示在我的公共服務器上。 – 2013-02-22 19:28:58

+0

公共服務器可以直接訪問私有服務器上的文件嗎?或者它是否必須是網絡請求? – Bobson 2013-02-22 19:48:40

回答

2

您可以檢查響應內容類型並根據您的需求做出您需要的內容。 您需要更改動作才能返回ActionResult而不是字符串。

if(response.ContentType.Equals("text/html")) 
{ 
//show html stuff 
return Content(resultado); 

} 
else if(response.ContentType.Contains("image/")) 
{ 

    var ms = new MemoryStream(); 
    responseStream.BaseStream.CopyTo(ms); 

    var imageBytes = ms.ToArray(); 
    return File(imageBytes, response.ContentType); 
} 
+0

問題是我返回一個字符串.. 我應該返回另一種類型嗎? – 2013-02-22 20:50:04

+0

@FedeLerner,取決於。你究竟在哪裏返回字符串?誰/這種退貨類型的消費者是什麼? – scartag 2013-02-22 20:55:08

+0

嗯,它是一個ASP.NET MVC 4(4.0 .NET Framework)應用程序,所以字符串被返回到客戶端,在我的問題中看到的Index函數在Controller上。我直接返回responseStream.ReadToEnd()的字符串,這就是瀏覽器客戶端獲取HTML並解釋它的方式。我想這不是實現這個目的的最好方法,但是這是我實現它的唯一方法(不幸的是,僅限於HTML)。 – 2013-02-22 21:20:57

0

你必須寫一個系統,從resultado讀取你的HTML或圖片做根據的東西再加上你需要控制你的網址爲好。