【问题标题】:Reading a JavaScript file and outputing it back through HttpHandler读取一个 JavaScript 文件并通过 HttpHandler 输出回来
【发布时间】:2011-12-08 06:20:26
【问题描述】:

你知道 Twitter 没有通过 https 提供它的小部件 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 的形式返回。我在这里错过了什么?

更新

也尝试了下面的代码,看看它是否有任何区别并且也没有工作:

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;
            }
        }
    }
}

【问题讨论】:

    标签: c# .net asp.net twitter httphandler


    【解决方案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)
        {
    
        }
    }
    

    【讨论】:

    • StatusCode 和 StatusDescription 也正常。
    • 也用于 request.ContentType ?
    • 我已经将它用于 request.ContentType。不管我对 context.Response.ContentType 使用什么,响应 ContentLength 都会返回为 -1。
    • 感谢您的帮助。我用不同的方法解决了这个问题:stackoverflow.com/questions/7776631/…
    【解决方案2】:

    我用下面的代码解决了我的问题。不确定这是否是正确的做法:

        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);
        }
    

    【讨论】:

      【解决方案3】:

      除了您始终假定编码为 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);
                      }                    
                  }
              }
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 2019-12-20
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多