【问题标题】:C# Multiple http requests same PHP sessionC#多个http请求同一个PHP会话
【发布时间】:2011-05-26 12:32:54
【问题描述】:

我正在尝试将图片加载到发送 POST 请求的同一 PHP 会话中。 但是因为我使用的是 button1_Click 这是不可能的。 结果是在发送数据之前加载图片。 如果您有任何问题,请随时提出。

我知道我在加载图片时出错了,但我不知道确切的位置..

使用visual c# 2010 express winforms

private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.ImageLocation = "http://localhost/proj/guess-my-fav/1.jpg";
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Uri uri = new Uri("http://localhost/proj/guess-my-fav/level14.php");
        var answer = textBox1.Text;
        string data = "guess=" + answer + "&level=14&time=opt";
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
        request.Method = WebRequestMethods.Http.Post;
        request.CookieContainer = new CookieContainer();
        request.KeepAlive = true;
        request.ContentLength = data.Length;
        request.ContentType = "application/x-www-form-urlencoded";
        StreamWriter writer = new StreamWriter(request.GetRequestStream());
        writer.Write(data);
        writer.Close();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string tmp = reader.ReadToEnd();
        response.Close();
        richTextBox1.AppendText(tmp); // log - delete this line          
    }

如何将图像的渲染放在第二个请求下?

【问题讨论】:

  • 我认为 php 和 C# 不应该像这样重叠。
  • :)) 你这是什么意思...

标签: c# php http httprequest


【解决方案1】:
pictureBox1.ImageLocation = "http://localhost/proj/guess-my-fav/1.jpg";

这将导致客户端的浏览器请求1.jpg

Uri uri = new Uri("http://localhost/proj/guess-my-fav/level14.php");
...
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

这将导致运行 ASP.NET 网站的网络服务器请求level14.php

您不会使用同一个会话来获取这两个请求,因为它们将来自两台不同的机器!

您可能希望考虑将 HttpWebRequest 代码移出后端,并在客户端将其重新实现为 AJAX 请求。那么这两个请求都将来自客户端的浏览器。

【讨论】:

  • 我想避开客户端浏览器,我尝试在第二个请求下渲染它
【解决方案2】:

如果您修改代码以匹配

 private CookieContainer cookieContainer;

        private void Form1_Load(object sender, EventArgs e)
        {

            var wr = (HttpWebRequest)WebRequest.Create("http://localhost/proj/guess-my-fav/1.jpg");
            cookieContainer = new CookieContainer();
            wr.CookieContainer = this.cookieContainer;
            var resp = (HttpWebResponse)wr.GetResponse();
            wr.CookieContainer = cookieContainer;
            using (var s = resp.GetResponseStream())
            {
                pictureBox1.Image = new Bitmap(s);
            }
        }



private void button1_Click(object sender, EventArgs e)
    {
        Uri uri = new Uri("http://localhost/proj/guess-my-fav/level14.php");
        var answer = textBox1.Text;
        string data = "guess=" + answer + "&level=14&time=opt";
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
        request.Method = WebRequestMethods.Http.Post;
        request.CookieContainer = cookieContainer;
        request.KeepAlive = true;
        request.ContentLength = data.Length;
        request.ContentType = "application/x-www-form-urlencoded";
        StreamWriter writer = new StreamWriter(request.GetRequestStream());
        writer.Write(data);
        writer.Close();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string tmp = reader.ReadToEnd();
        response.Close();
        richTextBox1.AppendText(tmp); // log - delete this line          
    }

这应该使用同一个会话向服务器发出两个请求。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我在这里假设您希望在单击按钮时重新加载图像。

    首先,ImageLocation 属性可能不会尊重您的会话 cookie,因此您可能必须手动下载图像。您已经使用了CookieContainer,所以这是一个好的开始。

    我们在这里要做的是使用一个新的HttpWebRequest 来下载图像并将相同的CookieContainer 附加到它,因为它应该在您第一次调用后保存会话ID。 然后我们可以使用HttpWebResponse 创建一个Image 对象并将其分配给pictureBox1.Image 属性。

    所有这一切可能看起来像这样:

    private void button1_Click(object sender, EventArgs e)
    {
        Uri uri = new Uri("http://localhost/proj/guess-my-fav/level14.php");
        var answer = textBox1.Text;
        string data = "guess=" + answer + "&level=14&time=opt";
    
        CookieContainer cookies = new CookieContainer(); /* we want to have this for other call also
    
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
        request.Method = WebRequestMethods.Http.Post;
        request.CookieContainer = cookies;
        request.KeepAlive = true;
        request.ContentLength = data.Length;
        request.ContentType = "application/x-www-form-urlencoded";
        StreamWriter writer = new StreamWriter(request.GetRequestStream());
        writer.Write(data);
        writer.Close();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string tmp = reader.ReadToEnd();
        response.Close();
        richTextBox1.AppendText(tmp); // log - delete this line 
    
        HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create("http://localhost/proj/guess-my-fav/1.jpg");
        request2.CookieContainer = cookies;
        HttpWebResponse response2 = (HttpWebResponse)request.GetResponse();
        pictureBox1.Image = Image.LoadFromStream(response2.GetResponseStream());
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2021-05-24
      相关资源
      最近更新 更多