2011-10-15 36 views
2

你知道Twitter沒有通過https服務它的widget javascript文件,所以我決定通過httphandler提供它,到目前爲止,我迷路了!閱讀JavaScript文件並通過HttpHandler將其輸出回去

這是我迄今所做的:

public void ProcessRequest(HttpContext context) { 

    context.Response.ContentType = "application/javascript"; 

    WebRequest request = WebRequest.Create("http://widgets.twimg.com/j/2/widget.js"); 
    request.Method = "GET"; 
    request.ContentType = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

    using (WebResponse response = request.GetResponse()) { 

     using (Stream requestStream = response.GetResponseStream()) { 

      Stream outStream = context.Response.OutputStream; 
      byte[] buffer = new byte[1024]; 
      int len = (int)response.ContentLength, bytes; 

      while (len > 0 && (bytes = 
       requestStream.Read(buffer, 0, buffer.Length)) > 0) { 

       outStream.Write(buffer, 0, bytes); 
       len -= bytes; 
      } 
     } 
    } 
} 

我得到沒有錯誤,但是當我調試的代碼,我看到response.ContentLength是回來爲-1。我在這裏錯過了什麼?

UPDATE

嘗試下面的代碼,以及看它是否有什麼差別,並沒有工作,要麼:

public void ProcessRequest(HttpContext context) { 

    context.Response.ContentType = "application/x-javascript"; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://widgets.twimg.com/j/2/widget.js"); 
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    request.Method = "GET"; 

    using (WebResponse response = request.GetResponse()) { 

     using (Stream requestStream = response.GetResponseStream()) { 

      Stream outStream = context.Response.OutputStream; 
      byte[] buffer = new byte[1024]; 
      int len = (int)response.ContentLength, bytes; 

      while (len > 0 && (bytes = 
       requestStream.Read(buffer, 0, buffer.Length)) > 0) { 

       outStream.Write(buffer, 0, bytes); 
       len -= bytes; 
      } 
     } 
    } 
} 

回答

1

我解決我的問題與下面的代碼。不知道這是否是做的正確方法:

public void ProcessRequest(HttpContext context) { 

     context.Response.ContentType = "application/x-javascript"; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://widgets.twimg.com/j/2/widget.js"); 
     request.Accept = "application/javascript"; 
     request.KeepAlive = false; 
     request.Method = "GET"; 

     HttpWebResponse webresponse = (HttpWebResponse)request.GetResponse(); 

     Encoding enc = System.Text.Encoding.GetEncoding(1252); 
     StreamReader loResponseStream = new 
      StreamReader(webresponse.GetResponseStream(), enc); 

     string Response = loResponseStream.ReadToEnd(); 

     context.Response.Write(Response); 
    } 
1
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    public override void ProcessRequest(HttpContext context) 
    { 
     int bytesProcessed = 0; 
     Stream remoteStream = null; 
     Stream localStream = null; 
     context.Response.ContentType = "application/octet-stream"; 

     WebRequest request = WebRequest.Create("http://widgets.twimg.com/j/2/widget.js"); 
    // request.Method = "GET"; 
     request.ContentType = "application/octet-stream"; 

     using (WebResponse response = request.GetResponse()) 
     { 

      using (Stream requestStream = response.GetResponseStream()) 
      { 
       localStream = File.Create(@"c:\1.y2yy"); 

       // Allocate a 1k buffer 
       byte[] buffer = new byte[1024]; 
       int bytesRead; 

       // Simple do/while loop to read from stream until 
       // no bytes are returned 
       do 
       { 
        // Read data (up to 1k) from the stream 
        bytesRead = requestStream.Read(buffer, 0, buffer.Length); 

        // Write the data to the local file 
        localStream.Write(buffer, 0, bytesRead); 

        // Increment total bytes processed 
        bytesProcessed += bytesRead; 
       } while (bytesRead > 0); 
       localStream.Close(); 
      } 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 
+0

沒有運氣,沒有工作。 – tugberk

+0

StatusCode和StatusDescription也是OK。 – tugberk

+0

也適用於request.ContentType? –

0

有你的代碼,只是你總是假定編碼沒有問題的是1252所以,如果你知道它的存在是沒有問題的。在完美的世界中,服務器的響應將在其標題中指示編碼。但情況並非總是如此。查看此question瞭解有關該主題的更多信息。

我改變了你的代碼一點點。

public void ProcessRequest(HttpContext context) 
{   
     WebRequest request = WebRequest.Create("http://widgets.twimg.com/j/2/widget.js"); 
     request.Method = "GET"; 
     request.ContentType = "application/javascript"; 

     using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) 
     { 
      Encoding enc = String.IsNullOrEmpty(response.CharacterSet) ? 
       Encoding.GetEncoding(1252) : Encoding.GetEncoding(response.CharacterSet); 

      using (var reader = new StreamReader(response.GetResponseStream(), enc)) 
      { 
       var jsContent = reader.ReadToEnd(); 

       if (!String.IsNullOrEmpty(jsContent)) { 
        context.Response.ContentType = "application/javascript"; 
        context.Response.Write(jsContent); 
       }      
      } 
     } 
}