亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現可緩存網頁到本地的反向代理工具實例

2020-01-24 01:54:09
字體:
來源:轉載
供稿:網友

本文實例講述了C#實現可緩存網頁到本地的反向代理工具。分享給大家供大家參考。具體實現方法如下:

proxy.ashx 主文件:

<%@ WebHandler Language="C#" Class="proxy" %>using System;using System.Web;using System.Net;using System.Text;using System.IO;using System.Collections.Generic;using System.Configuration;/// <summary>/// 把http headers 和 http 響應的內容 分別存儲在 /proxy/header/ 和 /proxy/body/ 中/// 分層次創建目錄/// </summary>public class proxy : IHttpHandler{ HttpResponse Response; HttpRequest Request; HttpApplicationState Application; HttpServerUtility Server; static string proxyCacheFolder = ConfigurationManager.AppSettings["proxyCacheFolder"]; static string proxyDomain = ConfigurationManager.AppSettings["proxyDomain"]; static string proxyReferer = ConfigurationManager.AppSettings["proxyReferer"]; bool proxyCacheDirectAccess = ConfigurationManager.AppSettings["proxyCacheDirectAccess"] == "true"; int proxyCacheSeconds = int.Parse(ConfigurationManager.AppSettings["proxyCacheSeconds"]); public void ProcessRequest(HttpContext context) {  Response = context.Response;  Request = context.Request;  Application = context.Application;  Server = context.Server;  string path = context.Request.RawUrl;  bool delCache = path.IndexOf("?del") > 0;  if (delCache)  {   path = path.Replace("?del", string.Empty);   DeleteCacheFile(path);   return;  }  bool allowCache = Request.QueryString["cache"] == "true";  string seconds = Request.QueryString["seconds"] ?? string.Empty;  if (!int.TryParse(seconds, out proxyCacheSeconds))  {   proxyCacheSeconds = 3600;  }  if (allowCache)  {   EchoData(path);  }  else  {   WebClient wc = new WebClient();   wc.Headers.Set("Referer", proxyReferer);   byte[] buffer = wc.DownloadData(proxyDomain + path);   Response.ContentType = wc.ResponseHeaders["Content-Type"];   foreach (string key in wc.ResponseHeaders.AllKeys)   {    Response.Headers.Set(key, wc.ResponseHeaders[key]);   }   wc.Dispose();   Response.OutputStream.Write(buffer, 0, buffer.Length);  } } /// <summary> /// 清理失效的緩存 /// </summary> /// <param name="d"></param> void ClearTimeoutCache(DirectoryInfo d) {  if (d.Exists)  {   FileInfo[] files = d.GetFiles();   foreach (FileInfo file in files)   {    TimeSpan timeSpan = DateTime.Now - file.LastAccessTime;    if (timeSpan.TotalSeconds > proxyCacheSeconds)    {     file.Delete();    }   }  } } string GetCacheFolderPath(string hash) {  string s = string.Empty;  for (int i = 0; i <= 2; i++)  {   s += hash[i] + "/";  }  return s; } /// <summary> /// 讀取緩存的header 并輸出 /// </summary> /// <param name="cacheHeaderPath"></param> void EchoCacheHeader(string cacheHeaderPath) {  string[] headers = File.ReadAllLines(cacheHeaderPath);  for (int i = 0; i < headers.Length; i++)  {   string[] headerKeyValue = headers[i].Split(':');   if (headerKeyValue.Length == 2)   {    if (headerKeyValue[0] == "Content-Type")    {     Response.ContentType = headerKeyValue[1];    }    Response.Headers.Set(headerKeyValue[0], headerKeyValue[1]);   }  } } void DeleteCacheFile(string path) {  string absFolder = Server.MapPath(proxyCacheFolder);  string hash = GetHashString(path);  string folder = GetCacheFolderPath(hash);  string cacheBodyPath = absFolder + "/body/" + folder + hash;  string cacheHeaderPath = absFolder + "/header/" + folder + hash;  FileInfo cacheBody = new FileInfo(cacheBodyPath);  FileInfo cacheHeader = new FileInfo(cacheHeaderPath);  if (cacheBody.Exists)  {   cacheBody.Delete();  }  if (cacheHeader.Exists)  {   cacheHeader.Delete();  }  Response.Write("delete cache file Success!/r/n" + path); } /// <summary> /// 輸出緩存 /// </summary> /// <param name="cacheHeaderPath">緩存header 的文件路徑</param> /// <param name="cacheBodyPath">緩存 body 的文件路徑</param> /// <param name="ifTimeout">是否進行判斷文件過期</param> /// <returns>是否輸出成功</returns> bool EchoCacheFile(string cacheHeaderPath, string cacheBodyPath, bool ifTimeout) {  FileInfo cacheBody = new FileInfo(cacheBodyPath);  FileInfo cacheHeader = new FileInfo(cacheHeaderPath);  ClearTimeoutCache(cacheBody.Directory);  ClearTimeoutCache(cacheHeader.Directory);  if (cacheBody.Exists && cacheHeader.Exists)  {   if (ifTimeout)   {    TimeSpan timeSpan = DateTime.Now - cacheBody.LastWriteTime;    if (timeSpan.TotalSeconds < proxyCacheSeconds)    {     EchoCacheHeader(cacheHeaderPath);     Response.TransmitFile(cacheBodyPath);     return true;    }   }   else   {    EchoCacheHeader(cacheHeaderPath);    Response.TransmitFile(cacheBodyPath);    return true;   }  }  return false; } void EchoData(string path) {  string absFolder = Server.MapPath(proxyCacheFolder);  string hash = GetHashString(path);  string folder = GetCacheFolderPath(hash);  string cacheBodyPath = absFolder + "/body/" + folder + hash;  string cacheHeaderPath = absFolder + "/header/" + folder + hash;  bool success;  if (proxyCacheDirectAccess)  {   success = EchoCacheFile(cacheHeaderPath, cacheBodyPath, false);   if (!success)   {    Response.Write("直接從緩存讀取失敗!");   }   return;  }  success = EchoCacheFile(cacheHeaderPath, cacheBodyPath, true);  if (success)  {   return;  }  //更新Cache File  string ApplicationKey = "CacheList";  List<string> List = null;  if (Application[ApplicationKey] == null)  {      Application.Lock();   Application[ApplicationKey] = List = new List<string>(1000);   Application.UnLock();  }  else  {   List = (List<string>)Application[ApplicationKey];  }  //判斷是否已有另一個進程正在更新Cache File  if (List.Contains(hash))  {   success = EchoCacheFile(cacheHeaderPath, cacheBodyPath, false);   if (success)   {    return;   }   else   {    WebClient wc = new WebClient();    wc.Headers.Set("Referer", proxyReferer);    //主體內容    byte[] data = wc.DownloadData(proxyDomain + path);    //處理header    Response.ContentType = wc.ResponseHeaders["Content-Type"];    foreach (string key in wc.ResponseHeaders.AllKeys)    {     Response.Headers.Set(key, wc.ResponseHeaders[key]);    }    wc.Dispose();    Response.BinaryWrite(data);   }  }  else  {   WebClient wc = new WebClient();   wc.Headers.Set("Referer", proxyReferer);   StringBuilder headersb = new StringBuilder();   List.Add(hash);   //主體內容   byte[] data = wc.DownloadData(proxyDomain + path);   //處理header   Response.ContentType = wc.ResponseHeaders["Content-Type"];   foreach (string key in wc.ResponseHeaders.AllKeys)   {    headersb.Append(key);    headersb.Append(":");    headersb.Append(wc.ResponseHeaders[key]);    headersb.Append("/r/n");    Response.Headers.Set(key, wc.ResponseHeaders[key]);   }   wc.Dispose();   string headers = headersb.ToString().Trim();   if (!Directory.Exists(absFolder + "/header/" + folder))   {    Directory.CreateDirectory(absFolder + "/header/" + folder);   }   StreamWriter sw = File.CreateText(absFolder + "/header/" + folder + hash);   sw.Write(headers);   sw.Close();   sw.Dispose();   //處理緩存內容   if (!Directory.Exists(absFolder + "/body/" + folder))   {    Directory.CreateDirectory(absFolder + "/body/" + folder);   }   FileStream fs = File.Create(absFolder + "/body/" + folder + hash);   fs.Write(data, 0, data.Length);   fs.Close();   fs.Dispose();   List.Remove(hash);   Response.BinaryWrite(data);  } } string GetHashString(string path) {  string md5 = GetMd5Str(path);  return md5; } static string GetMd5Str(string ConvertString) {  System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();  string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);  t2 = t2.Replace("-", "");  return t2; } public bool IsReusable {  get  {   return false;  } }}

web.config文件如下:

<?xml version="1.0"?><configuration> <configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>  </configSections> <RewriterConfig> <Rules>  <RewriterRule>  <LookFor>~/.*$</LookFor>  <SendTo>  <!--cache=true 設置此路徑進行緩存-->   <![CDATA[~/proxy.ashx?cache=true&seconds=30]]>  </SendTo>  </RewriterRule>  <RewriterRule>  <LookFor>~/ajax/.*$</LookFor>  <SendTo>  <!--cache=false 設置此路徑不允許緩存-->   <![CDATA[~/proxy.ashx?cache=false]]>  </SendTo>  </RewriterRule> </Rules> </RewriterConfig> <appSettings> <!--#反向代理設置 start--> <!--設置站點--> <add key="proxyDomain" value="http://127.0.0.1:12123/"/> <!--緩存文件夾--> <add key="proxyCacheFolder" value="/proxyCache/"/> <!--緩存時長--> <add key="proxyCacheSeconds" value="3600"/> <!--設置不再判斷緩存文件是否超時,直接從緩存讀取--> <add key="proxyCacheDirectAccess" value="false"/> <!--設置反向代理Referer--> <add key="proxyReferer" value="http://www.www.com/"/> <!--#反向代理設置 end--> </appSettings> <system.webServer> <modules runAllManagedModulesForAllRequests="true">  <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/> </modules> </system.webServer> <system.web> <compilation debug="true"/> </system.web></configuration>

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频在线观看| 欧美午夜性色大片在线观看| 91av视频在线播放| 午夜精品一区二区三区视频免费看| 亚洲自拍偷拍在线| 91成人福利在线| 中日韩美女免费视频网址在线观看| 日韩中文字幕av| 日韩精品在线私人| 国产精品日韩在线一区| 久久久精品网站| 成人羞羞国产免费| 日韩中文字幕精品| 国产日韩欧美在线观看| 欧美极品少妇与黑人| 欧美黑人性视频| 中文字幕欧美视频在线| 国产精品久久久久久久久久久新郎| 欧美高清不卡在线| 亚洲精品国产精品国产自| 欧美日韩第一视频| 欧洲精品久久久| 日本精品久久久久久久| 欧美日韩国产成人在线| 青草成人免费视频| 国产精品视频免费在线观看| 久久综合伊人77777| 6080yy精品一区二区三区| 亚洲精品欧美日韩专区| 亚洲最大av网站| 98视频在线噜噜噜国产| 精品在线小视频| 综合136福利视频在线| 亚洲风情亚aⅴ在线发布| 欧美日韩国产成人| 亚洲欧美日本精品| 精品在线观看国产| 欧美日韩xxx| 国产丝袜一区二区三区| 69**夜色精品国产69乱| 欧美二区乱c黑人| 欧美综合国产精品久久丁香| 亚洲护士老师的毛茸茸最新章节| 91免费视频网站| 亚洲小视频在线观看| 97精品国产aⅴ7777| 2019中文字幕在线观看| 日韩视频在线免费| 日本精品久久久久久久| 日本国产精品视频| 2019av中文字幕| 91国偷自产一区二区三区的观看方式| 国产一区二区视频在线观看| 久久久女人电视剧免费播放下载| 日韩欧美在线看| 国产成人精品久久二区二区91| 日韩精品免费在线播放| 97在线观看视频国产| 亚洲人成电影网站色| 亚洲成**性毛茸茸| 午夜精品久久久久久久久久久久久| 一区二区欧美日韩视频| 国产精品欧美一区二区三区奶水| 久久伊人91精品综合网站| 国产三级精品网站| 日本一区二区三区四区视频| 久久91超碰青草是什么| 国产日韩欧美另类| 欧美激情免费视频| 成人做爰www免费看视频网站| 国产精品视频久久久| 日韩国产高清视频在线| 精品美女国产在线| 久久99国产精品久久久久久久久| 日韩精品亚洲视频| 日本精品久久电影| 一区二区三区四区在线观看视频| 国产精品久久久久aaaa九色| 亚洲人成毛片在线播放| 午夜精品一区二区三区在线视| 精品久久久在线观看| 插插插亚洲综合网| 欧美高清第一页| 国产裸体写真av一区二区| 91精品国产91久久久| 一区二区三区四区在线观看视频| 91视频免费在线| 欧美高跟鞋交xxxxhd| 精品香蕉一区二区三区| 7m第一福利500精品视频| 欧美日韩亚洲视频一区| 伊人伊成久久人综合网站| 亚洲乱亚洲乱妇无码| 97久久伊人激情网| 亚洲网在线观看| 欧美激情一二三| 韩日欧美一区二区| 国产成人在线视频| 最近更新的2019中文字幕| 色与欲影视天天看综合网| 欧美精品午夜视频| 欧美精品video| 国产美女搞久久| 日韩有码片在线观看| 国产精品成人在线| 国产精品免费视频久久久| 国产视频福利一区| 精品欧美aⅴ在线网站| 日韩激情av在线免费观看| 91美女福利视频高清| 日韩一级裸体免费视频| 欧美巨乳在线观看| 97国产精品人人爽人人做| 欧美激情喷水视频| 色yeye香蕉凹凸一区二区av| 国产精品永久免费在线| 大荫蒂欧美视频另类xxxx| 91视频免费网站| 亚洲aⅴ男人的天堂在线观看| 国产精品福利久久久| 久久久国产精品亚洲一区| 亚洲国语精品自产拍在线观看| 日韩女优人人人人射在线视频| 欧美精品性视频| 色综合亚洲精品激情狠狠| 欧美老妇交乱视频| 精品香蕉在线观看视频一| 91精品久久久久久久久中文字幕| 欧美电影免费看| 久久成人人人人精品欧| 久久精品国产亚洲精品| 91视频88av| 欧美成人免费一级人片100| 久久久中文字幕| 在线观看欧美视频| 久久久久久噜噜噜久久久精品| 欧美成人剧情片在线观看| 136fldh精品导航福利| 亚洲乱亚洲乱妇无码| 精品国产精品自拍| 亚洲精品视频免费| 国产经典一区二区| 亚洲香蕉av在线一区二区三区| 韩曰欧美视频免费观看| 色悠悠久久88| 欧美激情中文字幕在线| 亚洲精品国精品久久99热| 日韩亚洲欧美中文高清在线| 亚洲精品白浆高清久久久久久| 久久精品2019中文字幕| 久久久av亚洲男天堂| 日韩最新av在线| 亚洲欧美精品中文字幕在线| 国产精品都在这里| 国产精品久久久久久久午夜| 国产激情999| 亚洲精品狠狠操| 一个人看的www久久| 疯狂欧美牲乱大交777| 久久久久久国产精品美女| 亚洲美女在线视频| 亚洲理论在线a中文字幕| 曰本色欧美视频在线| 69影院欧美专区视频|