Проблема с прокси на хосте C # - PullRequest
0 голосов
/ 08 апреля 2009

Использование моего прокси: "Proxy.ashx? Url ="

Код:

<%@ WebHandler Language="C#" Class="Proxy" %>

public class Proxy : IHttpHandler {

public void ProcessRequest (HttpContext context) {

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(context.Request["url"]);
    request.UserAgent = context.Request.UserAgent;
    request.ContentType = context.Request.ContentType;
    request.Method = context.Request.HttpMethod;

    byte[] trans = new byte[1024];
    int offset = 0;
    int offcnt = 0;

    if (request.Method.ToUpper() == "POST")
    {
        Stream nstream = request.GetRequestStream();
        while (offset < context.Request.ContentLength)
        {
            offcnt = context.Request.InputStream.Read(trans, offset, 1024);
            if (offcnt > 0)
            {
                nstream.Write(trans, 0, offcnt);
                offset += offcnt;
            }
        }
        nstream.Close();
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        context.Response.ContentType = response.ContentType;

        using (Stream receiveStream = response.GetResponseStream())
        {
            offset = 0;
            offcnt = receiveStream.Read(trans, offset, 1024);
            while (offcnt>0)
            {
                context.Response.OutputStream.Write(trans, 0, offcnt);
                offset += offcnt;
                if (offcnt >= 0)
                {
                    try
                    {
                        offcnt = receiveStream.Read(trans, offset, 1024);
                    }
                    catch (Exception)
                    {
                        break;
                    }
                }
                else
                    break;       
            }
        }
        context.Response.OutputStream.Close();
        context.Response.Flush();
        response.Close();
    }
}

public bool IsReusable {
    get {
        return false;
    }
}

}

В результате я всегда получаю пустую страницу (Proxy.ashx? Url = http://www.google.com) ... Есть идеи, какую ошибку я совершил?

1 Ответ

1 голос
/ 08 апреля 2009

Для обработки POST ContentLength может быть 0, не полагайтесь на него. Просто откройте поток и прочитайте как можно больше, пока поток не вернет больше данных.

В остальном смещение при чтении в массив должно оставаться 0, поскольку это смещение массива, а не потока.

using (Stream receiveStream = response.GetResponseStream()) {
   for (int offcnt = receiveStream.Read(trans, 0, trans.Length); offcnt > 0; offcnt = receiveStream.Read(trans, 0, trans.Length)) {
      context.Response.OutputStream.Write(trans, 0, offcnt);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...