рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдзреИрд░реНрдп рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рд╣рдордиреЗ рдПрдХ рдкреЛрд░реНрдЯ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдПрдХ ASPX рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЪрд▓ рд░рд╣реЗ рдПрдЬрд╝реНрдпреЛрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдХреМрди рд╕рд╛ рдкреЛрд░реНрдЯ рдЕрдЬрд╝реВрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рдкреНрд░реАрд╕реЗрдЯ
рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЬрдиреНрдо рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдЬреИрд╕реЗ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ рдерд╛ рддрд╛рдХрд┐ Azure рдЙрджрд╛рд╣рд░рдг azureproxy.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо IIS 7.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрднреА рднреА рдорд╢реАрди рдкрд░ рдЪрд▓рддрд╛ рд╣реИред
IIS рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ, AzureProxy рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреВрд▓ рдЬреЛрдбрд╝реЗрдВ
рд╣рдо .Net рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред
рдФрд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдЬреЛрдбрд╝реЗ
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ "AzureProxy", рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреВрд▓ "AzureProxy" рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднреМрддрд┐рдХ рдкрде рдХреЛрдИ рднреА рд╣реИ (рдпрд╣рд╛рдВ D: \ AzureProxy \)ред рдЖрдкрдХреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдЖрдИрдкреА рдкрддрд╛ - 127.0.0.1, рдкреЛрд░реНрдЯ - 80, рд╣реЛрд╕реНрдЯрдирд╛рдо - azureproxy.com ред
рд╣рдореЗрдВ IIS рдХреЗ рд▓рд┐рдП Url Rewrite рдореЙрдбреНрдпреВрд▓ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ www.iis.net/download/URLRewrite рдкрд░ рдЬрд╛рдХрд░ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдЧрд▓рд╛ рдХрджрдо рдореЗрдЬрдмрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ azureproxy.com рдЬреЛрдбрд╝рдирд╛ рд╣реИред
рд╕рдВрдкрд╛рджрдХ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓реЗрдВ: C: \ Windows \ System32 \ driver \ etc \ рдореЗрдЬрдмрд╛рди рдФрд░ рдЗрд╕рдореЗрдВ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ
127.0.0.1 azureproxy.com
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдо
рдпрд╣ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ - ASP .NET рд░рд┐рдХреНрдд рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рд╢реЗрд╖ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред
Web.Config рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
<? xml version ="1.0" ? >
< configuration >
< system.web >
< compilation debug ="true" targetFramework ="4.0" />
< pages enableViewStateMac ="false" />
</ system.web >
< system.webServer >
< modules runAllManagedModulesForAllRequests ="true" >
< add name ="AzureProxyModule" type ="AzureProxy.AzureProxyModule, AzureProxy" />
</ modules >
< rewrite >
< rules >
< rule name ="All" stopProcessing ="true" >
< match url ="^(.*)$" />
< action type ="Rewrite" url ="/Default.aspx?url={HtmlEncode:{R:0}}" />
</ rule >
</ rules >
</ rewrite >
</ system.webServer >
</ configuration >
* This source code was highlighted with Source Code Highlighter .
рдПрдХ рдирдпрд╛ рд╡реЗрдм рдлрд╝реЙрд░реНрдо рдЬреЛрдбрд╝реЗрдВ
Default.aspx рдирд╛рдо
рдФрд░ рд╣рдо рдЙрд╕рдореЗрдВ рд╣реА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AzureProxy.Default" %>
рдЖрдЧреЗ рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
рдирд╛рдо AzureProxyModule.cs рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ
using System;
using System.Net;
using System.IO;
using System.Configuration;
using System.Collections. Generic ;
using System.Linq;
using System.Web;
using System.Threading;
namespace AzureProxy
{
public class AzureProxyModule : IHttpModule
{
const string Domain = "127.0.0.1" ;
const int MaxPort = 110;
public static string Port = "" ;
public Queue< int > ports = new Queue< int >();
public List <Thread> threads = new List <Thread>();
public bool ThreadsLive = false ;
public AzureProxyModule()
{
}
public String ModuleName
{
get { return "AzureProxyModule" ; }
}
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest +=
new EventHandler( this .OnBeginRequest);
httpApp.EndRequest +=
new EventHandler( this .OnEndRequest);
}
public void OnBeginRequest( object o, EventArgs ea)
{
}
public void OnEndRequest( object o, EventArgs ea)
{
HttpApplication httpApp = (HttpApplication)o;
if (Port.Length == 0)
{
SearchPort();
}
DoRequest();
}
public void DoRequest()
{
byte [] buffer = new byte [4096];
HttpContext ctx;
ctx = HttpContext .Current;
if (ctx.Request.QueryString[ "url" ] == null ) return ;
HttpWebRequest myHttp = (HttpWebRequest)HttpWebRequest.Create( "http://" + Domain + ":" + Port + ctx.Request.RawUrl.ToString());
myHttp.AllowAutoRedirect = false ;
myHttp.KeepAlive = true ;
myHttp.CookieContainer = new CookieContainer();
myHttp.UserAgent = ctx.Request.UserAgent;
foreach ( string CookieName in ctx.Request.Cookies.AllKeys)
{
if (ctx.Request.Cookies[CookieName].Domain != null )
{
myHttp.CookieContainer.Add( new Cookie(ctx.Request.Cookies[CookieName].Name, ctx.Request.Cookies[CookieName].Value, ctx.Request.Cookies[CookieName].Path, ctx.Request.Cookies[CookieName].Domain));
}
else
{
myHttp.CookieContainer.Add( new Cookie(ctx.Request.Cookies[CookieName].Name, ctx.Request.Cookies[CookieName].Value, ctx.Request.Cookies[CookieName].Path, Domain));
}
}
myHttp.ContentType = ctx.Request.ContentType;
if (ctx.Request.HttpMethod == "POST" )
{
myHttp.Method = "POST" ;
myHttp.AllowWriteStreamBuffering = true ;
myHttp.ContentLength = ctx.Request.InputStream.Length;
Stream requestStream = myHttp.GetRequestStream();
int length = 0;
while ((length = ctx.Request.InputStream.Read(buffer, 0, buffer.Length)) > 0)
{
requestStream.Write(buffer, 0, length);
}
}
try
{
WebResponse response = myHttp.GetResponse();
if (response.Headers[ "Location" ] != null )
{
ctx.Response.Redirect(response.Headers[ "Location" ]);
}
using ( Stream stream = response.GetResponseStream())
{
using (MemoryStream memoryStream = new MemoryStream())
{
int count = 0;
do
{
count = stream.Read(buffer, 0, buffer.Length);
memoryStream.Write(buffer, 0, count);
} while (count != 0);
ctx.Response.ContentType = response.ContentType;
foreach ( string HeaderKey in response.Headers.Keys)
{
ctx.Response.AddHeader(HeaderKey, response.Headers[HeaderKey]);
}
ctx.Response.BinaryWrite(memoryStream.ToArray());
}
}
}
catch (WebException code)
{
switch (code.Message)
{
case "Unable to connect to the remote server" :
SearchPort();
DoRequest();
break ;
case "The remote server returned an error: (404) Not Found." :
ctx.Response.Status = "404 File Not Found" ;
break ;
}
return ;
}
}
public void SearchPort()
{
Port = "" ;
for ( int port = 81; port < MaxPort; port++)
{
ports.Enqueue(port);
threads.Add( new Thread( new ThreadStart(PortTest)));
}
threads.ForEach( new Action<Thread>(ThreadStart));
while (TreadsIsLive() && (Port.Length == 0))
{
//
}
//
threads.ForEach( new Action<Thread>(ThreadAbort));
}
public void Dispose() { }
public bool TreadsIsLive()
{
ThreadsLive = false ;
threads.ForEach( new Action<Thread>(ThreadTest));
return true ;
}
public void ThreadTest(Thread t)
{
ThreadsLive = ThreadsLive || t.IsAlive;
}
protected void ThreadStart(Thread t)
{
try
{
ThreadsLive = true ;
if (!t.IsAlive) t.Start();
}
catch { }
}
protected void ThreadAbort(Thread t)
{
t.Abort();
}
protected void PortTest()
{
int port;
try
{
port = ports.Dequeue();
HttpWebRequest myHttpWebRequest =
(HttpWebRequest)HttpWebRequest.Create( "http://" + Domain + ":" + port.ToString());
try
{
HttpWebResponse myHttpWebResponse =
(HttpWebResponse)myHttpWebRequest.GetResponse();
Port = port.ToString();
return ;
}
catch { }
}
catch { }
}
}
}
* This source code was highlighted with Source Code Highlighter .
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ IIS рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ
Azure рдЕрдм azureproxy.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдкрддреЗ рд╕реЗ рдПрдЬрд╝реНрдпреЛрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдПрдХ рдЙрдкрд▓рдмреНрдз рдкреЛрд░реНрдЯ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдмрд╛рд▓ рдЯреНрд░реЗрдбреЛрдВ рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкреЛрд░реНрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдвреВрдВрдврдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред GET рдФрд░ POST рджреЛрдиреЛрдВ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ, рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдЬрд╝реНрдпреЛрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
PS рдпрд╣ рд▓реЗрдЦ AzureProxy рдмрдирд╛рдиреЗ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдЖрд╡реЗрджрди рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред