C # Несколько запросов HTTP один и тот же сеанс PHP - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь загрузить картинку в том же сеансе PHP, в котором будет отправлен запрос POST. Но поскольку я использую 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          
    }

Как поставить рендеринг изображения под вторым запросом?

Ответы [ 3 ]

1 голос
/ 26 мая 2011
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-запроса. Тогда оба запроса будут поступать из браузера клиента.

0 голосов
/ 26 мая 2011

Я предполагаю, что вы хотите перезагрузить изображение при нажатии кнопки.

Прежде всего, это свойство ImageLocation, вероятно, не будет учитывать ваш файл cookie сеанса, поэтому вам, возможно, придется загрузить изображение вручную. Вы уже использовали CookieContainer, так что это хорошее начало.

Здесь мы хотим использовать новый HttpWebRequest, чтобы загрузить изображение и прикрепить к нему тот же CookieContainer, так как этот должен содержать идентификатор сеанса после вашего первого вызова. Затем мы можем использовать 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());

}
0 голосов
/ 26 мая 2011

Если вы измените свой код для соответствия

 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          
    }

Это должно сделать оба запроса к серверу, используя тот же сеанс.

Надеюсь, это поможет.

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