使用C#和ASP.NET,我想以编程方式在网页(窗体)上填写一些值(4个文本框),然后"发布"这些值。 我该怎么做呢?
编辑:澄清:有一项服务(www.stopforumspam.com),您可以在其"添加"页面上提交IP,用户名和电子邮件地址。 我希望能够在我的网站页面上创建一个链接/按钮,该链接/按钮将填写这些值并提交信息,而不必在其中复制/粘贴它们并单击"提交"按钮。
进一步说明:自动垃圾邮件机器人如何填写表格并单击"提交"按钮(如果它们是用C#编写的)?
您可以在此处查看该示例:http://en.csharp-online.net/HTTP_Post
基本上,代码将如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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(); |
您可以在WebClient上使用UploadValues方法-所需的只是传递URL和NameValueCollection。这是我发现的最简单的方法,MS文档提供了一个很好的示例:
http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx
这是带有一些错误处理的简单版本:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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类是响应正文和状态代码的简单包装。
查看页面的源,并使用WebRequest类进行发布。无需驱动IE。只需弄清楚IE将发送到服务器的内容并将其复制即可。使用Fiddler之类的工具将使其变得更加容易。
您可以通过多种方式发送发布/获取请求。不同类型的库可为您提供帮助。
我发现选择我应该使用的选项以及它们之间的区别是令人困惑的。
冲浪堆栈溢出后,这是我找到的最佳答案。这个线程解释了所有
https://stackoverflow.com/a/4015346/1999720
在哪里编码字符串:
Encoding.Default.GetBytes(postData);
使用Ascii代替Google API:
Encoding.ASCII.GetBytes(postData);
这使您的请求与等效的" curl --data" ..." [url]"请求相同
我遇到这样的情况,我需要以编程方式从html文本区域发布自由文本,并且遇到我正在建立的参数列表中出现
的问题。
为了安全起见,我的解决方案是用换行符和htmlencoding替换br标签。
1 2 3
| Regex.Replace( HttpUtility.HtmlDecode( test ),"(<br.*?>)","
" ,RegexOptions.IgnoreCase); |