Файлы cookie не сохраняются с прокси aspx - PullRequest
0 голосов
/ 20 февраля 2012

Я только что настроил прокси-страницу для обработки ajax-запросов, но не могу заставить ее работать, так как куки не сохраняются вообще. Мой код выглядит следующим образом:

public partial class JsonProxy : System.Web.UI.Page
{

private string username;
private string password;
private int idPlant;
private string mode;

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        username = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["username"])) ? HttpUtility.UrlDecode(Request.Form["username"].ToString()) : string.Empty;
        password = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["password"])) ? HttpUtility.UrlDecode(Request.Form["password"].ToString()) : string.Empty;
        idPlant = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["idPlant"])) ? int.Parse(HttpUtility.UrlDecode(Request.Form["idPlant"].ToString())) : 0;
        mode = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["mode"])) ? HttpUtility.UrlDecode(Request.Form["mode"].ToString()) : string.Empty;

        string response = "";
        HttpWebRequest wc;

        if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password) && idPlant != 0 && !String.IsNullOrEmpty(mode))
        {
            //First do authentication
            wc= (HttpWebRequest)WebRequest.Create("http://10.255.255.10/Base/Authentication/Login/" + username + "/" + password + ".aspx");
            wc.Method = "GET";

            StreamReader  reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());
            if (reader.ReadToEnd().Contains("true"))
            {
                //Then check that authentication succeded
                wc = (HttpWebRequest)WebRequest.Create("http://10.255.255.10/Base/Authentication/IsAuthenticated.aspx");
                wc.Method = "GET";

                reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());

                string str = reader.ReadToEnd();
                if (str.Contains("true"))
                {
                    //Then make BP request
                    string methodName = "/Base/BusinessPlan/GetBPAlll/" + idPlant + ".aspx";
                    wc = (HttpWebRequest)WebRequest.Create("http://10.255.255.10" + methodName);
                    wc.Method = "GET";
                    reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());
                    response = reader.ReadToEnd();
                }
            }

        }

        //Last: write response
        Response.ContentType = "application/json";
        Response.Write(response);
    }
    catch (WebException ex)
    {
        Response.Write("error");
    }
}

}

Запрос на вход в систему должен создать некоторые куки в клиенте, которые используются в следующем запросе (IsAuthenticated) и в последнем (на самом деле настоящий запрос). Однако IsAuthenticated возвращает false только после того, как я правильно выполнил вход в систему (я вижу, что он возвращает true, как и ожидалось). Это как если бы я никогда не входил в систему.
Итак, вопрос: как я могу сохранить куки в прокси?
Я открыт для ответов, которые также учитывают HttpHandlers или другие методы для выполнения ajax-прокси, не обязательно Aspx.
Примечание: если я делаю одну и ту же серию запросов, я вижу, как создаются файлы cookie, поэтому это должен быть вопрос моего прокси aspx

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

В этом случае куки не будут сохраняться на клиенте, так как это код сервера, который делает запрос. Файлы cookie будут отправлены как часть ответа на ваш сервер, но не обратно клиенту.
Я думаю, чтобы получить поведение, на которое вы надеетесь, вам потребуется получить объект коллекции cookie из исходного ответа и скопировать его в следующие два объекта запроса.

0 голосов
/ 20 февраля 2012

После дальнейшего поиска я обнаружил, что вам нужно вручную передать cookieContainer следующим запросам. вот полный и рабочий пример:

public partial class JsonProxy : System.Web.UI.Page

{

private string username;
private string password;
private int idPlant;
private string mode;
private CookieContainer cookieJar = new CookieContainer();

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        username = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["username"])) ? HttpUtility.UrlDecode(Request.Form["username"].ToString()) : string.Empty;
        password = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["password"])) ? HttpUtility.UrlDecode(Request.Form["password"].ToString()) : string.Empty;
        idPlant = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["idPlant"])) ? int.Parse(HttpUtility.UrlDecode(Request.Form["idPlant"].ToString())) : 0;
        mode = !String.IsNullOrEmpty(HttpUtility.UrlDecode(Request.Form["mode"])) ? HttpUtility.UrlDecode(Request.Form["mode"].ToString()) : string.Empty;

        string response = "";
        HttpWebRequest wc;

        if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password) && idPlant != 0 && !String.IsNullOrEmpty(mode))
        {
            //First do authentication
            wc= (HttpWebRequest)WebRequest.Create("http://10.255.255.10/Base/Authentication/Login/" + username + "/" + password + ".aspx");
            wc.Method = "GET";
            wc.CookieContainer = cookieJar;

            StreamReader  reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());
            if (reader.ReadToEnd().Contains("true"))
            {
                //Then check that authentication succeded
                wc = (HttpWebRequest)WebRequest.Create("http://10.255.255.10/Base/Authentication/IsAuthenticated.aspx");
                wc.Method = "GET";
                wc.CookieContainer = cookieJar;

                reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());

                string str = reader.ReadToEnd();
                if (str.Contains("true"))
                {
                    //Then make BP request
                    string methodName = "/Base/BusinessPlan/GetBPAll/" + idPlant + ".aspx";
                    wc = (HttpWebRequest)WebRequest.Create("http://10.255.255.10" + methodName);
                    wc.Method = "GET";
                    wc.CookieContainer = cookieJar;
                    reader = new StreamReader(((HttpWebResponse)wc.GetResponse()).GetResponseStream());
                    response = reader.ReadToEnd();
                }
            }
        }

        //Last: write response
        Response.ContentType = "application/json";
        Response.Write(response);
    }
    catch (WebException ex)
    {
        Response.ContentType = "application/json";
        Response.Write("error");
    }
}

}

Bye!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...