HttpProxyHandler


<%@ WebHandler Language="C#" Debug="True" Class="Microshaoft.HttpProxyHandler" %>
namespace Microshaoft
{
    using System;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Web;
    public class HttpProxyHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            HttpWebRequest httpWebRequest = null;
            WebResponse webResponse = null;
            try
            {
                var request = context.Request;
                string url = request["fw"];
                byte[] buffer = ReadStreamToBytes(request.InputStream);
                httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
                httpWebRequest.Method = request.HttpMethod;
                httpWebRequest.ContentType = request.ContentType;
                httpWebRequest.UserAgent = request.UserAgent;
                httpWebRequest.KeepAlive = false;
                ServicePointManager.Expect100Continue = false;
                //httpWebRequest.SendChunked = true;
                //httpWebRequest.TransferEncoding = request.ContentEncoding.EncodingName;
                if
                    (
                        request.Headers.AllKeys.Any
                                                (
                                                    (x) =>
                                                    {
                                                        return (x.ToLower() == "soapaction");
                                                    }
                                                )
                    )
                {
                    httpWebRequest.Headers.Add("SOAPAction", request.Headers["SOAPAction"]);
                }
                httpWebRequest.Headers.Add("X-Forwarded-For", request.UserHostAddress);
                httpWebRequest.Timeout = 10 * 1000;
                if (buffer.Length > 0)
                {
                    using (Stream stream = httpWebRequest.GetRequestStream())
                    {
                        stream.Write(buffer, 0, buffer.Length);
                        stream.Close();
                    }
                }
                webResponse = httpWebRequest.GetResponse();
                using (Stream stream = webResponse.GetResponseStream())
                {
                    buffer = ReadStreamToBytes(stream);
                    stream.Close();
                }
                var response = context.Response;
                response.BinaryWrite(buffer);
            }
            catch (Exception e)
            {
                throw new Exception("OrignalInnerException", e);
            }
            finally
            {
                if (webResponse != null)
                {
                    webResponse.Close();
                    webResponse = null;
                }
                if (httpWebRequest != null)
                {
                    httpWebRequest.Abort();
                    httpWebRequest = null;
                }
            }
        }
        private byte[] ReadStreamToBytes(Stream stream)
        {
            byte[] buffer = new byte[64 * 1024];
            MemoryStream ms = new MemoryStream();
            int r = 0;
            int l = 0;
            long position = -1;
            if (stream.CanSeek)
            {
                position = stream.Position;
                stream.Position = 0;
            }
            while (true)
            {
                r = stream.Read(buffer, 0, buffer.Length);
                if (r > 0)
                {
                    l += r;
                    ms.Write(buffer, 0, r);
                }
                else
                {
                    break;
                }
            }
            byte[] bytes = new byte[l];
            ms.Position = 0;
            ms.Read(bytes, 0, (int)l);
            ms.Close();
            ms = null;
            if (position >= 0)
            {
                stream.Position = position;
            }
            return bytes;
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
/*
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title> new document </title>
    <META NAME="Generator" CONTENT="EditPlus,Microshaoft">
    <META NAME="Author" CONTENT="EditPlus,Microshaoft">
    <META NAME="Keywords" CONTENT="EditPlus,Microshaoft">
    <META NAME="Description" CONTENT="EditPlus,Microshaoft">
</head>
<body>
<form method="post" action="http://local.asp.net/proxy.ashx" target="_blank">
    <input type="text" name="a" />
    <input type="text" name="fw" value="http://interface.morsing.local/test.aspx" />
    <input type="submit" />
</form>
</body>
</html>
*/

posted @ 2012-07-21 09:26  于斯人也  阅读(682)  评论(0编辑  收藏  举报