【问题标题】:How to fill forms and submit with Webclient in C#如何在 C# 中使用 Webclient 填写表单并提交
【发布时间】:2009-04-27 14:29:37
【问题描述】:

我不熟悉在 C# 中使用库 WebClient、HttpResponse 和 HttpRequest,如果我的问题难以阅读,请耐心等待。

我需要构建一个基于 C# 的 WinForm,它可以打开一个 URL,该 URL 受到基本授权的保护。我通过将其添加到标题中来做到这一点,如下所示:

using (WebClient wc = new WebClient())
{
    wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " +
    Convert.ToBase64String(
    Encoding.ASCII.GetBytes(username + ":" + password)));
}

到目前为止,一切都很好!现在我想用一个数字填写一个表格,我从网站上找到源代码,发现名字是“数字”。所以我写了这个:

NameValueCollection formData = new NameValueCollection();  
formData["number"] = number
byte[] responseBytes = wc.UploadValues(theurl, "POST", formData);
string response = Encoding.ASCII.GetString(responseBytes);
textBox_HTML.Text = response; 

但是我该如何提交呢?我想收到我的“搜索结果”...

【问题讨论】:

  • (回复您的问题已添加)
  • 所以我可以澄清一下 - 您想将“响应”视为 HTML 表单并从中进行 POST 吗?相反,使用表格知识会更容易 - 这可能吗? (使用 Fiddler 之类的东西)。如果您必须使用实际的表单,则最好使用WebBrowser 之类的东西来使用实际的浏览器/DOM 会话(而不是 http,它对 html 一无所知)。跨度>

标签: c# webclient


【解决方案1】:

您可能应该为此使用HttpWebRequest。这是一个简单的例子:

var strId = UserId_TextBox.Text;
var strName = Name_TextBox.Text;

var encoding=new ASCIIEncoding();
var postData="userid="+strId;
postData += ("&username="+strName);
byte[]  data = encoding.GetBytes(postData);

var myRequest =
  (HttpWebRequest)WebRequest.Create("http://localhost/MyIdentity/Default.aspx");
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
var newStream=myRequest.GetRequestStream();
newStream.Write(data,0,data.Length);
newStream.Close();

var response = myRequest.GetResponse();
var responseStream = response.GetResponseStream();
var responseReader = new StreamReader(responseStream);
var result = responseReader.ReadToEnd();

responseReader.Close();
response.Close();

【讨论】:

  • 因此,对花时间使用您不喜欢的编码风格编写代码示例的人投反对票比实际提供答案更多有用。有趣....
  • 我不同意你们。如果没有 IDE,我可以查看其中的每一个变量并告诉你它们是什么。
  • 感谢您的回答。我使用 HttpWebrequest 没有问题,但我看到它的方式,代码中没有任何内容填写搜索表单并提交。这是我的主要问题。
  • 我通常也不使用匈牙利符号,当我回答这个问题时,我一定是复制并粘贴了该代码。至于var,我用的很多,我会捍卫它!!!
  • C# 中的 @GeorgeStocker var 与 Visual Basic 中的 var 不同。在 C# 中,使用 var 关键字声明的变量是强类型的,编译器将 var 替换为具体类型。 msdn.microsoft.com/en-us/library/bb383973.aspx
【解决方案2】:

试试这个:

using System.Net;
using System.Collections.Specialized;  

NameValueCollection values = new NameValueCollection();
values.Add("TextBox1", "value1");
values.Add("TextBox2", "value2");
values.Add("TextBox3", "value3");
string Url = urlvalue.ToLower();

using (WebClient client = new WebClient())
{
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    byte[] result = client.UploadValues(Url, "POST", values);
    string ResultAuthTicket = System.Text.Encoding.UTF8.GetString(result);
}

【讨论】:

    【解决方案3】:

    我找到了解决问题的方法。首先,我对 http 通信中的一些基础知识感到困惑。这是由我编写的 python 脚本引起的,它的通信方式不同。

    我通过从头开始生成 POST 数据并打开包含在表单操作中的 uri 解决了这个问题。

    【讨论】:

      【解决方案4】:

      BFree 的回答效果很好。不过,我要注意的一件事是,数据连接确实应该是 url 编码的,否则你会在数据中遇到诸如“=”和“&”符号之类的问题。

      下面是 VB.NET 版本,urlencoded 并支持 UTF-8(请注意,url-encoding 需要引用 System.Web.dll,它仅在我从 .NET 4 Compact Framework 切换到常规的 .NET 4 框架)。

      Imports System.Web
      Imports System.Net
      Imports System.IO
      
      Public Class WebFormSubmitter
      
          Public Shared Function submit(ByVal address As String,
                                        ByVal values As Dictionary(Of String, String)) As String
              Dim encoding As New UTF8Encoding
              Dim postData As String = getPostData(values:=values)
              Dim data() As Byte = encoding.GetBytes(postData)
      
              Dim request = CType(WebRequest.Create(address), HttpWebRequest)
              request.Method = "POST"
              request.ContentType = "application/x-www-form-urlencoded"
              request.ContentLength = data.Length
              Dim newStream = request.GetRequestStream()
              newStream.Write(data, 0, data.Length)
              newStream.Close()
      
              Dim response = request.GetResponse()
              Dim responseStream = response.GetResponseStream()
              Dim responseReader = New StreamReader(responseStream)
              Return responseReader.ReadToEnd()
          End Function
      
          Private Shared Function getPostData(ByVal values As Dictionary(Of String, String)) As String
              Dim postDataPairList As New List(Of String)
              For Each anEntry In values
                  postDataPairList.Add(anEntry.Key & "=" & HttpUtility.UrlEncode(anEntry.Value))
              Next
              Return String.Join(separator:="&", values:=postDataPairList)
          End Function
      
      End Class
      

      【讨论】:

        【解决方案5】:

        使用 System.Net.Http.HttpClient 发布表单并将响应读取为字符串:

        var formData = new Dictionary<string, string>();
        formData.Add("number", number);
        
        var content = new FormUrlEncodedContent(formData);
        
        using (var httpClient = new HttpClient())
        {
            var httpResponse = await httpClient.PostAsync(theurl, content);
        
            var responseString = await httpResponse.Content.ReadAsStringAsync();
        }
        

        【讨论】:

          【解决方案6】:

          您已经使用UploadValues 提交了它。问题是:你的“结果搜索”是什么?页面返回什么? HTML?如果是这样 - HTML Agility Pack 是解析 html 的最简单方法。

          【讨论】:

          • 如果我已经用UploadValues提交了,为什么“响应”包含完全相同的代码,好像不使用UploadValues一样?代码如何知道 HTML 页面设计用于提交的按钮是什么?
          • 我猜还有其他必需的表单元素。使用 Fiddler 跟踪来自服务器的实际请求并检查表单内容。重新“什么按钮”......请求中有 is 没有按钮;这是一个 UI 设备,浏览器将其转换为 GET/POST/等。
          • 抱歉,我对这个问题感到困惑,因为我很难弄清楚如何在页面上填写简单的表格。结果页面返回一个cgi页面,其中包含simpel up table which infomation。
          猜你喜欢
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 2012-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          相关资源
          最近更新 更多