你如何以编程方式填写表格并“发布”网页?

时间:2008-08-25 20:49:47

标签: c# asp.net

使用C#和ASP.NET我想以编程方式在网页(表单)上填写一些值(4个文本框),然后“POST”这些值。我该怎么做?

编辑:澄清:有一项服务(www.stopforumspam.com),您可以在其“添加”页面上提交IP,用户名和电子邮件地址。我希望能够在我的网站页面上创建一个链接/按钮,用于填写这些值并提交信息,而无需复制/粘贴它们,然后单击提交按钮。

进一步澄清:自动垃圾邮件机器人如何填写表格,如果用C#编写,请点击提交按钮?

6 个答案:

答案 0 :(得分:46)

您可以在此处查看示例:http://en.csharp-online.net/HTTP_Post

基本上,代码看起来像这样:

WebRequest req = WebRequest.Create("http://mysite/myform.aspx");
string postData = "item1=11111&item2=22222&Item3=33333";

byte[] send = Encoding.Default.GetBytes(postData);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = send.Length;

Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();

WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();

答案 1 :(得分:4)

您可以在WebClient上使用UploadValues方法 - 它只需要传递URL和NameValueCollection。这是我找到的最简单的方法,MS文档有一个很好的例子:
http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx

这是一个带有错误处理的简单版本:

var webClient = new WebClient();
Debug.Info("PostingForm: " + url);
try
{
     byte [] responseArray = webClient.UploadValues(url, nameValueCollection);
     return new Response(responseArray, (int) HttpStatusCode.OK);
}
catch (WebException e)
{
     var response = (HttpWebResponse)e.Response;
     byte[] responseBytes = IOUtil.StreamToBytes(response.GetResponseStream());
     return new Response(responseBytes, (int) response.StatusCode);
}  

Response类是响应正文和状态代码的简单包装器。

答案 2 :(得分:1)

查看页面的来源并使用WebRequest类进行发布。无需驾驶IE。只需弄清楚IE正在向服务器发送什么并复制它。使用像Fiddler这样的工具可以使它变得更加容易。

答案 3 :(得分:0)

我有一种情况,我需要以编程方式从html textarea发布自由文本,并且我在我正在构建的参数列表中遇到了<br />的问题。

我的解决方案是使用换行符和htmlencoding替换br标签只是为了安全。

Regex.Replace( HttpUtility.HtmlDecode( test ), "(<br.*?>)", "\r\n" ,RegexOptions.IgnoreCase);

答案 4 :(得分:0)

编码字符串的位置:

  

Encoding.Default.GetBytes(POSTDATA);

使用Ascii代替google apis:

  

Encoding.ASCII.GetBytes(POSTDATA);

这使得您的请求与#34; curl --data&#34; ...&#34;相同。 [网址]&#34;请求

答案 5 :(得分:0)

您可以通过多种方式发送帖子/获取请求。不同类型的图书馆可以提供帮助。 我发现选择哪一个以及其中的差异令人困惑

在浏览堆栈溢出后,这是我找到的最佳答案。这个帖子解释了所有

https://stackoverflow.com/a/4015346/1999720