C # с использованием HttpListener и Request.ServerVariables в Windows Forms или консоли - PullRequest
4 голосов
/ 19 января 2011

Цели проекта:

Создайте локального прокси-судьи, используя консоль или приложение Windows Form для отладки и тестирования соединений.

  1. Проект должен запрашивать и получать параметры прокси-сервера для отображения на стороне клиента.
  2. Разобрать IP-адрес и вернуть состояние анонимности.
  3. Реализовать базовую схему защиты.
  4. Проект не должен использовать скрипты для функциональности (например, PHP, Perl, Asp и т. Д.)
  5. Совместимость с несколькими платформами (возможно)

alt text


Вопросы:

  1. Можно ли использовать Request.ServerVariables в локальном Windows или консольном приложении или это специфично для ASP?

  2. Если этот метод специфичен для ASP, есть ли другой способ запросить переменные сервера из сеанса браузера?

  3. Если описанный выше метод возможен, каков правильный подход для достижения этой функциональности?

  4. Что является хорошим примером для проверки / настройки базовой схемы аутентификации здесь? Как установить пароль и пользователя, который будет использоваться и т. Д.


Использованные ссылки:

http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx http://www.java2s.com/Code/CSharpAPI/System.Net/HttpListenerContextResponseStatusCode.htm http://en.cship.org/wiki/ProxyJudge

Пример кода:

using System.IO;
using System.Net;
using System.Web;
using System.Collections.Specialized;

namespace IPJudge
{
    public class IPJudgeClass : IHttpModule
    {
        public static void Main()
        {
            using (HttpListener listener = new HttpListener())
            {
                listener.AuthenticationSchemes = AuthenticationSchemes.None;
                listener.Prefixes.Add("http://localhost:8080/");
                //listener.Prefixes.Add("https://localhost/");
                listener.Start();

                HttpListenerContext ctx = listener.GetContext();
                ctx.Response.StatusCode = 200;
                string name = ctx.Request.QueryString["name"];

                StreamWriter writer = new StreamWriter(ctx.Response.OutputStream);
                writer.WriteLine("<P>Hello, {0}</P>", name);
                writer.WriteLine("<ul>");
                foreach (string header in ctx.Request.Headers.Keys)
                {
                    writer.WriteLine("<li><b>{0}:</b> {1}</li>", header, ctx.Request.Headers[header]);
                }
                writer.WriteLine("</ul>");

                writer.Close();
                ctx.Response.Close();
                listener.Stop();
            }
        }

        public void Init(HttpApplication app)
        {

            app.AcquireRequestState += new System.EventHandler(app_AcquireRequestState);
            app.PostAcquireRequestState += new System.EventHandler(app_PostAcquireRequestState);
        }

        public void app_AcquireRequestState(object o, System.EventArgs e)
        {
            HttpApplication httpApp = (HttpApplication)o;
            HttpContext ctx = HttpContext.Current;
            ctx.Response.Write(" Executing AcquireRequestState ");
            ctx.Response.Close();
        }

        public void Dispose()
        {
            // TODO:
            // Add code to clean up the
            // instance variables of a module.
        }

        public void app_PostAcquireRequestState(object o, System.EventArgs e)
        {
            HttpApplication httpApp = (HttpApplication)o;
            HttpContext ctx = HttpContext.Current;

            string remotehost  = ctx.Request.ServerVariables["REMOTE_ADDR"];
            string httpuseragent = ctx.Request.ServerVariables["HTTP_USER_AGENT"];
            string requstmethod = ctx.Request.ServerVariables["REQUEST_METHOD"];
            string httpreferer = ctx.Request.ServerVariables["HTTP_REFERER"];
            string HTTPXFORWARDEDFOR = ctx.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            string HTTPFORWARDEDFOR = ctx.Request.ServerVariables["HTTP_FORWARDED_FOR"];
            string HTTPXFORWARDED = ctx.Request.ServerVariables["HTTP_X_FORWARDED"];


            ctx.Response.Write("<P>REMOTE_ADDR: " + remotehost + "</P>");
            ctx.Response.Write("<P>HTTP_USER_AGENT: " + httpuseragent + "</P>");
            ctx.Response.Write("<P>REQUEST_METHOD: " + httpuseragent + "</P>");
            ctx.Response.Write("<P>HTTP_REFERER: " + httpreferer + "</P>");
            ctx.Response.Write("<P>HTTP_X_FORWARDED_FOR: " + httpreferer + "</P>");
            ctx.Response.Write("<P>HTTP_FORWARDED_FOR: " + httpreferer + "</P>");
            ctx.Response.Write("<P>HTTP_X_FORWARDED: " + httpreferer + "</P>");
            ctx.Response.Close();
        }
    }
}

1 Ответ

1 голос
/ 19 января 2011

Ваш код объединяет логику ASP.NET и логику приложения, что не может / не должно быть сделано.

A IHttpModule запускается IIS в веб-приложении ASP.NET

Метод Main запускается консольным приложением

Вопросы:

  1. Request.ServerVariables доступен только на веб-сервере

  2. Метод, который у вас есть (app_PostAcquireRequestState), где вы выводите переменные в поток ответов, - это то, как я это делаю. Но не обычно в HttpModule или в этом конкретном методе. Попробуйте вывести переменные ближе к концу конвейера ASP.NET.

  3. Вы можете включить трассировку в web.config <trace>, которая должна вывести некоторые переменные, которые вам нужны.

http://msdn.microsoft.com/en-us/library/6915t83k.aspx

  1. Не уверен, о чем вы здесь говорите, у вас есть пример кода.
...