ReverseProxy for IIS 6.0 in CS using ASP.NET: Difference between revisions

From
Jump to navigation Jump to search
 
(14 intermediate revisions by 2 users not shown)
Line 1: Line 1:
== Problem to solve ==
== Problem to solve ==
We want to embed content from a internal web-server e.g. <code><nowiki>http://foo</nowiki></code> to our public web-server
We want to embed content from an internal webserver e.g. <code><nowiki>http://foo</nowiki></code> to our public webserver
<code><nowiki>http://sar.informatik.hu-berlin.de</nowiki></code>. In particular the frontend request
<code><nowiki>http://sar.informatik.hu-berlin.de</nowiki></code>. In particular the frontend request
<code><nowiki>http://sar.informatik.hu-berlin.de/test/bla.html</nowiki></code> should get the response for <code><nowiki>http://foo/dir/bla.html</nowiki></code>.
<code><nowiki>http://sar.informatik.hu-berlin.de/test/bla.html</nowiki></code> should get the response for <code><nowiki>http://foo/dir/bla.html</nowiki></code>.
Line 8: Line 8:


== Used Software ==
== Used Software ==
IIS [http://www.saltypickle.com/Home/16 ReverseProxy] in particular [http://www.saltypickle.com/Home/frontend16ThereforeProxy(v1.5).zip v1.5].
[http://www.saltypickle.com/Home/16 IIS Reverse Proxy] in particular [http://www.saltypickle.com/Home/uploads/16/ReverseProxy(v1.5).zip v1.5].
frontendredirectionsIprehanowikiase of software redirections of the backend server are not forwarded transparently to the frontend. Therfore we patched the C-Sharpe code to take care of that. We disabled the internal handling of redirections and transpose them instead to the frontend.
In that release of software redirections of the backend server are not forwarded transparently to the frontend. Therfore we patched the C-Sharpe code to take care of that. We disabled the internal handling <code>MaximumRedirections = 0;</code> of redirections and send them instead through the frontend to the browser.
The differences are:
<pre></pre>
<pre><nowiki>
Then redirections which usally occur if you enterXP.g. <code><nowiki>http://foo/dir -> http://foo/dir/</nowiki></code> are forwarded to the browser as <code><nowiki>http://sar.informatik.hu-berlin.de/test -> http://sar.informatik.hu-berlin.de/test/</nowiki></code>
38c38
< const int MaximumRedirections = 50;
---
> const int MaximumRedirections = 0;
357a358,370
> switch((int) backEndResponse.StatusCode) {
> case 301:
> case 302:
> case 303:
> case 307:
> frontEndResponse.StatusCode = (int) backEndResponse.StatusCode;
> string newLocation = backEndResponse.Headers["Location"];
> newLocation = Regex.Replace(newLocation, backEndSite,
> frontEndRequest.Url.GetLeftPart(UriPartial.Authority) + frontEndRequest.ApplicationPath,
> RegexOptions.IgnoreCase);
> frontEndResponse.RedirectLocation = newLocation;
> break;
> }</nowiki>
</pre>
Complete [[ReverseProxy.cs]].

Then redirections which usally occur if you enter e.g. <code><nowiki>http://foo/dir -> http://foo/dir/</nowiki></code> are forwarded to the browser as <code><nowiki>http://sar.informatik.hu-berlin.de/test -> http://sar.informatik.hu-berlin.de/test/</nowiki></code>


== Installation ==
== Installation ==
Based on [http://www.saltypickle.com/Home/20 W2k/XP], [http://www.saltypickle.com/Home/19 Win2003]
Based on [http://www.saltypickle.com/Home/20 W2k/XP], [http://www.saltypickle.com/Home/19 Win2003]
pngrproxy=== Walk through ===
=== Walk through ===
# appSettingsktory where software lives e.g. <code>C:\Inetpub\test_virtual</code> and extract archive <code>"\\dc\pub\2006\2006 Software\ReverseProxy_15_SAR.zip"</code> to that directory. [[Image:rproxy_1.png]]
# Create directory where software lives e.g. <code>C:\Inetpub\test_virtual</code> and extract archive <code>"\\dc\pub\2006\2006 Software\ReverseProxy_15_SAR.zip"</code> to that directory. [[Image:rproxy_1.png]]
# Create in thBackEndSite virtual directory [[Image:rproxy_2.png]]
# Create in the IIS MMC a virtual directory [[Image:rproxy_2.png]]
# GappSettingsas name under which the resource should be reachable by the frontend <code>test</code> [[Image:rproxy_3.png]]
# Give the alias name under which the resource should be reachable by the frontend <code>test</code> [[Image:rproxy_3.png]]
# Select the Web Site Conten Directory <code>C:\Inetpub\test_virtual</code> [[Image:rproxy_4.png]]
# Select the Web Site Content Directory <code>C:\Inetpub\test_virtual</code> [[Image:rproxy_4.png]]
# OK. [[Image:rproxy_5.png]]
# OK. [[Image:rproxy_5.png]]
# nowikithepreoperties of the virtual dir. [[Image:rproxy_6.png]]
# Check the Properties of the virtual dir. [[Image:rproxy_6.png]]
# PUninstalling [[Image:rproxy_7.png]]
# Press Create. [[Image:rproxy_7.png]]
# Press Configuration [[Image:rproxy_8.png]]
# Press Configuration [[Image:rproxy_8.png]]
# Insert [[Image:rproxy_9.png]]
# Insert [[Image:rproxy_9.png]]
# Enter: Executable <code>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll</code> and uncheck "Verify that file exists" [[Image:rproxy_10.png]]
# Enter: Executable <code>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll</code> and uncheck "Verify that file exists" [[Image:rproxy_10.png]]
# If you saelect <code>.asax</code> and then press Edit it should look like that: [[Image:rproxy_11.png]]
# If you select <code>.asax</code> and then press Edit it should look like that: [[Image:rproxy_11.png]]
# Open cmd.exe to register <code>ICSharpCode.SharpZipLib.dll</code> and run <pre><nowiki>cd C:\Inetpub\test_virtual
# Open cmd-prompt and to register <code>ICSharpCode.SharpZipLib.dll</code> and run <pre><nowiki>cd C:\Inetpub\test_virtual
C:\Inetpub\test_virtual>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /i ICSharpCode.SharpZipLib.dll</nowiki></pre> [[Image:rproxy_12.png]]
C:\Inetpub\test_virtual>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /i ICSharpCode.SharpZipLib.dll</nowiki></pre> [[Image:rproxy_12.png]]
# Finallly you have to configure the proxy by editing <code>C:\Inetpub\test_virtual\Web.config</code> <pre><nowiki><?xml version="1.0" encoding="utf-8" ?>
# Finally you have to configure the proxy by editing <code>C:\Inetpub\test_virtual\Web.config</code><pre><nowiki><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configuration>


Line 41: Line 63:


== Uninstalling ==
== Uninstalling ==
* Unregister the gzip-DLL<code>ICSharpCode.SharpZipLib.dll</code> by running <code>gacutil /u ICSharpCode.SharpZipLib.dll</code>.
* Unregister the gzip-dll by running <code>gacutil /u ICSharpCode.SharpZipLib.dll</code>.
* Remove the virtual directory <code>test</code> in the IIS-MMC.
* Remove the virtual directory <code>test</code> in the IIS-MMC.
* Remove the directory <code>C:\Inetpub\test_virtual</code>.
* Remove the directory <code>C:\Inetpub\test_virtual</code>.
--[[User:Wolfm|WM]] 12:54, 13 December 2006 (CET)

Latest revision as of 11:54, 13 December 2006

Problem to solve

We want to embed content from an internal webserver e.g. http://foo to our public webserver http://sar.informatik.hu-berlin.de. In particular the frontend request http://sar.informatik.hu-berlin.de/test/bla.html should get the response for http://foo/dir/bla.html. Thus the mapping is:

  • http://sar.informatik.hu-berlin.de/test -> http://foo/dir.

From outside this should be look like a local web directory.

Used Software

IIS Reverse Proxy in particular v1.5. In that release of software redirections of the backend server are not forwarded transparently to the frontend. Therfore we patched the C-Sharpe code to take care of that. We disabled the internal handling MaximumRedirections = 0; of redirections and send them instead through the frontend to the browser. The differences are:

38c38
<   	const int MaximumRedirections = 50;
---
> 		const int MaximumRedirections = 0;
357a358,370
> 			switch((int) backEndResponse.StatusCode) {
> 				case 301:
> 				case 302:
> 				case 303:
> 				case 307:
> 					frontEndResponse.StatusCode = (int) backEndResponse.StatusCode;
> 					string newLocation = backEndResponse.Headers["Location"];
> 					newLocation = Regex.Replace(newLocation, backEndSite, 
> 						frontEndRequest.Url.GetLeftPart(UriPartial.Authority) + frontEndRequest.ApplicationPath, 
> 						RegexOptions.IgnoreCase);
> 					frontEndResponse.RedirectLocation = newLocation;
> 					break;
> 			}

Complete ReverseProxy.cs.

Then redirections which usally occur if you enter e.g. http://foo/dir -> http://foo/dir/ are forwarded to the browser as http://sar.informatik.hu-berlin.de/test -> http://sar.informatik.hu-berlin.de/test/

Installation

Based on W2k/XP, Win2003

Walk through

  1. Create directory where software lives e.g. C:\Inetpub\test_virtual and extract archive "\\dc\pub\2006\2006 Software\ReverseProxy_15_SAR.zip" to that directory. Rproxy 1.png
  2. Create in the IIS MMC a virtual directory Rproxy 2.png
  3. Give the alias name under which the resource should be reachable by the frontend test Rproxy 3.png
  4. Select the Web Site Content Directory C:\Inetpub\test_virtual Rproxy 4.png
  5. OK. Rproxy 5.png
  6. Check the Properties of the virtual dir. Rproxy 6.png
  7. Press Create. Rproxy 7.png
  8. Press Configuration Rproxy 8.png
  9. Insert Rproxy 9.png
  10. Enter: Executable C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll and uncheck "Verify that file exists" Rproxy 10.png
  11. If you select .asax and then press Edit it should look like that: Rproxy 11.png
  12. Open cmd-prompt and to register ICSharpCode.SharpZipLib.dll and run
    cd C:\Inetpub\test_virtual

C:\Inetpub\test_virtual>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /i ICSharpCode.SharpZipLib.dll Rproxy 12.png

  1. Finally you have to configure the proxy by editing C:\Inetpub\test_virtual\Web.config
    <?xml version="1.0" encoding="utf-8" ?>

<configuration>

<appSettings> <add key="BackEndSite" value="http://foo/dir" /> </appSettings>

 <system.web>

...

Uninstalling

  • Unregister the gzip-dll by running gacutil /u ICSharpCode.SharpZipLib.dll.
  • Remove the virtual directory test in the IIS-MMC.
  • Remove the directory C:\Inetpub\test_virtual.

--WM 12:54, 13 December 2006 (CET)