Чтение файла JavaScript и вывод его обратно через HttpHandler - PullRequest
2 голосов
/ 15 октября 2011

Вы знаете, что Twitter не передает свой файл javascript виджета через https, поэтому я решил обслужить его через 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;
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 октября 2011

Я решил свою проблему с помощью приведенного ниже кода.не уверен, что это правильно:

    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 голос
/ 15 октября 2011
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 голосов
/ 15 октября 2011

Нет проблем с вашим кодом, за исключением того, что вы всегда предполагаете, что кодировка - 1252. Так что, если вы знаете, что это так, то проблем нет.В идеальном мире ответ сервера будет указывать кодировку в его заголовках.Но это не всегда так.Проверьте этот вопрос для получения дополнительной информации по этому вопросу.

Я немного изменил ваш код.

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