代理主机C#问题

时间:2009-04-08 14:46:29

标签: c# proxy

我的代理用法:“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 个答案:

答案 0 :(得分:1)

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