【问题标题】:C# WebRequest GET/POSTC# WebRequest GET/POST
【发布时间】:2014-10-10 21:18:46
【问题描述】:

所以我认为是时候学习 C#了,伙计们,对我来说轻松一点,我对此很陌生。

我正在尝试创建一个非常简单的应用程序(我正在使用 Windows 窗体应用程序)。 我的目标是:

  1. 使用“GET”方法,获取网页
  2. 读取文本字段(每次用户访问页面时,此值都会更改
  3. 使用“POST”方法,相应地发送一些值

到目前为止,这是我的代码:

  private void button2_Click(object sender, EventArgs e)
{
    string URI = "http://localhost/post.php";
    string myParameters = "field=value1&field2=value2";

    using (WebClient wc = new WebClient())
    {
        string getpage = wc.DownloadString("http://localhost/post.php");
        MessageBox.Show(getpage);
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        string HtmlResult = wc.UploadString(URI, myParameters);
        MessageBox.Show(HtmlResult);
    }
}

到目前为止一切顺利,它正在工作,但这并不完全是我想要在这里实现的。 我可以使用 POST 方法,但是在发送数据之前如何使用 GET 呢? 我想根据GET结果发送数据。

如果我应该更好地描述我正在尝试做的事情,请告诉我。

谢谢。

编辑
这是我的 PHP 代码:

<?php

    $a = session_id();

    if(empty($a))
        session_start();

        echo "Session: ".session_id()."<br/>\n";

现在,回到我的 C# 代码,我在两条消息中得到不同的会话 ID

【问题讨论】:

  • 你试过download methods吗?尽管您的第 2 点有点令人困惑。阅读页面以获取用户输入的最终目标是什么。如果用户输入数据,您是否将其保存在数据库中?

标签: c# webrequest


【解决方案1】:

使用 GET 读取数据

请参考这个答案:Easiest way to read from a URL into a string in .NET

using(WebClient client = new WebClient()) {
    string s = client.DownloadString(url);
}

会话

默认情况下,WebClient 不使用任何会话。因此,每次调用都会像您创建一个新会话一样处理。为此,您需要这样的东西:

请参考以下答案:

  1. Using CookieContainer with WebClient class

  2. Reading Response From URL using HTTP WEB REQUEST

示例代码

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest != null)
        {
            webRequest.CookieContainer = m_container;
        }
        return request;
    }
}

// ...

private void button2_Click(object sender, EventArgs e)
{
    string URI = "http://localhost/post.php";
    string myParameters = "field=value1&field2=value2";

    using (WebClient wc = new CookieAwareWebClient())
    {
        string getpage = wc.DownloadString("http://localhost/post.php");
        MessageBox.Show(getpage);
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        string HtmlResult = wc.UploadString(URI, myParameters);
        MessageBox.Show(HtmlResult);
    }
}

【讨论】:

  • 我想他是在问如何使用 WebClient 类中的 GET 功能,这样他就可以获取数据,然后根据它制作一个 POST。
  • 我想知道这是否可行..因为它们需要在同一个会话中发生。编辑:伪编码器,这正是我的目标。
  • 大家好,我仍然无法弄清楚这一点。它仍然算作不同的会话。也许最好的比较是我们的浏览器(例如 Chrome)。您打开一个页面,然后提交其中的表单。没有刷新或任何东西
  • 您是否阅读了我关于会话的第二个链接?您必须正确设置客户端才能使用 CookieContainer 来处理会话。
  • 要使用会话,您必须使用 cookie。当您访问一个 url 时,会创建一个会话。 SessionId 作为 cookie 提供。您的客户端需要保存此 cookie 并下次发送,以便您的会话可以恢复。如果您在我的第二个链接中使用客户端,您的请求应该使用 cookie 并因此恢复您的会话。
【解决方案2】:

GET 方法实际上只是通过地址行传递的参数,只需将您的请求发送到string.Format("{0}?{1}", URI, myParameters)(或URI + "?" + myParameters)并读取响应即可。

【讨论】:

  • 我想这将取决于您的 PHP 脚本。我理解您的问题的方式是您想使用GETPOST 方法的组合将一些数据发送到页面。如果是这种情况,我不明白为什么不在同一个会话中。但是如果你想通过GET 发送一些东西,那么根据页面的响应使用POST 制作另一个请求,我相信这将是一个单独的请求。如果会话是指与浏览器中相同的会话,那么有一种方法可以处理它(cookies 等等),但如果我不记得了...
  • 我编辑了我的主要帖子,如果您能猜到问题出在哪里,请查看
【解决方案3】:

我很久以前就知道了,但是:

       byte[] readedData = null;

        await Task.Run(async() =>
        {
            using (WebClient client = new WebClient())
            {
                client.DownloadProgressChanged += (obj, args) => progessChangedAction?.Invoke(args.ProgressPercentage);

                readedData = await client.DownloadDataTaskAsync(requestUri).ConfigureAwait(false);
            }
        });

        return readedData;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多