使用代理访问web
来源:互联网 发布:淘宝流量卡是真的吗 编辑:程序博客网 时间:2024/04/30 00:30
using System;using System.IO;using System.Net;using System.Web;using System.Text;using System.Web.Mail;using System.Collections;using System.Configuration;using System.Web.SessionState;using System.DirectoryServices;namespace TryHTTPHandler{public class SyncHandler : IHttpHandler, IRequiresSessionState{ public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext Context) { string ServerURL = ""; try { char[] URL_Separator = { '/' }; string[] URL_List = Context.Request.Url.AbsoluteUri.Remove(0, 7).Split(URL_Separator); ServerURL = "http://" + URL_List[2].Remove(URL_List[2].Length - 5, 5) + @"/"; string URLPrefix = @"/" + URL_List[1] + @"/" + URL_List[2]; for ( int i = 3; i < URL_List.Length; i++ ) ServerURL += URL_List[i] + @"/"; ServerURL = ServerURL.Remove(ServerURL.Length -1, 1); WriteLog(ServerURL + " (" + Context.Request.Url.ToString() + ")"); Stream RequestStream = Context.Request.InputStream; byte[] PostData = new byte[Context.Request.InputStream.Length]; RequestStream.Read(PostData, 0, (int) Context.Request.InputStream.Length); HttpWebRequest ProxyRequest = ( HttpWebRequest) WebRequest.Create(ServerURL); if ( ConfigurationManager.AppSettings["UpchainProxy"] == "true" ) ProxyRequest.Proxy = new WebProxy( ConfigurationManager.AppSettings["Proxy"], true); ProxyRequest.Method = Context.Request.HttpMethod; ProxyRequest.UserAgent = Context.Request.UserAgent; CookieContainer ProxyCookieContainer = new CookieContainer(); ProxyRequest.CookieContainer = new CookieContainer(); ProxyRequest.CookieContainer.Add( ProxyCookieContainer.GetCookies(new Uri(ServerURL))); ProxyRequest.KeepAlive = true; if ( ProxyRequest.Method == "POST" ) { ProxyRequest.ContentType = "application/x-www-form-urlencoded"; ProxyRequest.ContentLength = PostData.Length; Stream ProxyRequestStream = ProxyRequest.GetRequestStream(); ProxyRequestStream.Write(PostData, 0, PostData.Length); ProxyRequestStream.Close(); } HttpWebResponse ProxyResponse = ( HttpWebResponse) ProxyRequest.GetResponse(); if (ProxyRequest.HaveResponse) { foreach(Cookie ReturnCookie in ProxyResponse.Cookies) { bool CookieFound = false; foreach(Cookie OldCookie in ProxyCookieContainer.GetCookies(new Uri(ServerURL))) { if (ReturnCookie.Name.Equals(OldCookie.Name)) { OldCookie.Value = ReturnCookie.Value; CookieFound = true; } } if (!CookieFound) ProxyCookieContainer.Add(ReturnCookie); } } Stream StreamResponse = ProxyResponse.GetResponseStream(); int ResponseReadBufferSize = 256; byte[] ResponseReadBuffer = new byte[ResponseReadBufferSize]; MemoryStream MemoryStreamResponse = new MemoryStream(); int ResponseCount = StreamResponse.Read(ResponseReadBuffer, 0, ResponseReadBufferSize); while ( ResponseCount > 0 ) { MemoryStreamResponse.Write(ResponseReadBuffer, 0, ResponseCount); ResponseCount = StreamResponse.Read(ResponseReadBuffer, 0, ResponseReadBufferSize); } byte[] ResponseData = MemoryStreamResponse.ToArray(); string ResponseDataString = Encoding.ASCII.GetString(ResponseData); if ( ProxyResponse.ContentType.StartsWith("text/html") ) { HTML.ParseHTML Parser = new HTML.ParseHTML(); Parser.Source = ResponseDataString; while( !Parser.Eof() ) { char ch = Parser.Parse(); if ( ch == 0 ) { HTML.AttributeList Tag = Parser.GetTag(); if ( Tag["href"] != null ) { if ( Tag["href"].Value.StartsWith( @"/") ) { WriteLog("URL " + Tag["href"].Value + " modified to " + URLPrefix + Tag["href"].Value); ResponseDataString = ResponseDataString.Replace( "/"" + Tag["href"].Value + "/"", "/"" + URLPrefix + Tag["href"].Value + "/""); } } if ( Tag["src"] != null ) { if ( Tag["src"].Value.StartsWith( @"/") ) { WriteLog("URL " + Tag["src"].Value + " modified to " + URLPrefix + Tag["src"].Value); ResponseDataString = ResponseDataString.Replace( "/"" + Tag["src"].Value + "/"", "/"" + URLPrefix + Tag["src"].Value + "/""); } } } } Context.Response.Write(ResponseDataString); } else Context.Response.OutputStream.Write(ResponseData, 0, ResponseData.Length); MemoryStreamResponse.Close(); StreamResponse.Close(); ProxyResponse.Close(); } catch ( Exception Ex ) { Context.Response.Write(Ex.Message.ToString()); WriteLog("An error has occurred while requesting the URL " + ServerURL + "(" + Context.Request.Url.ToString() + ")/n" + Ex.ToString()); } } private void WriteLog(string Message) { FileStream FS = new FileStream(ConfigurationManager.AppSettings[ "Log"], FileMode.Append, FileAccess.Write); string DateTimeString = DateTime.Now.ToString(); Message = "[" + DateTimeString + "] " + Message + "/n"; byte[] FileBuffer = Encoding.ASCII.GetBytes(Message); FS.Write(FileBuffer, 0, (int)FileBuffer.Length); FS.Flush(); FS.Close(); }}}