2011-10-15 1 views
2

Twitter가 https를 통해 위젯 자바 스크립트 파일을 제공하지 않는다는 것을 알고 있으므로 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도 정상적으로 처리됩니다. – tugberk

+0

요청에 대해서도 .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); 
       }      
      } 
     } 
}