2012-02-20 3 views
0

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

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, как ожидалось). Это похоже на то, что я никогда не вошёл в систему.
Итак, вопрос: как я могу сохранить cookie-файлы в прокси?
Я открыт для ответов, которые учитывают также HttpHandlers или другие техи, которые делают ajax-проксирование, не обязательно Aspx.
Примечание: если я делаю ту же серию запросов, я могу видеть, как файлы cookie создаются, поэтому это должно быть вопрос о моем прокси-сервере aspx

ответ

1

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

+0

Да, это то, что я сделал. Я принял ваш ответ, даже если я дам полный текст на всякий случай, если кто-то другой получит ту же проблему. – andreapier

0

После дальнейшего поиска я обнаружил, что вам необходимо вручную передать 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!

Смежные вопросы