【发布时间】:2011-02-23 11:10:50
【问题描述】:
我需要以编程方式模拟 HTTP POST,即,我需要使用一些 POST 变量生成请求,然后将其发送到页面。
为了澄清,我需要模拟常规 POST 的行为,而不是以编程方式完成整个事情。所以基本上我需要以与表单 POST 发生时相同的方式填写请求,然后将浏览器发送到需要 POST 的页面。
【问题讨论】:
标签: asp.net forms post redirect
我需要以编程方式模拟 HTTP POST,即,我需要使用一些 POST 变量生成请求,然后将其发送到页面。
为了澄清,我需要模拟常规 POST 的行为,而不是以编程方式完成整个事情。所以基本上我需要以与表单 POST 发生时相同的方式填写请求,然后将浏览器发送到需要 POST 的页面。
【问题讨论】:
标签: asp.net forms post redirect
这是一种方法。
您以 NameValueCollection 的形式向该方法发送 url 和名称/值参数。该方法在端点上创建一个 Http Post 并将响应作为字符串返回。
当然,根据您执行此操作的内容/原因以及此方法将被调用多少次,可能还有其他选择。但在您提供有关您的具体需求的更多信息之前,这种方法已经足够了。
下面的方法使用 Tasks (.NET 4.0) 和异步方法,因此如果您在循环中进行多次调用,它将比下一个代码清单中的同步方法更快。
static string GetWebResponse(string url, NameValueCollection parameters)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
var sb = new StringBuilder();
foreach (var key in parameters.AllKeys)
sb.Append(key + "=" + parameters[key] + "&");
sb.Length = sb.Length - 1;
byte[] requestBytes = Encoding.UTF8.GetBytes(sb.ToString());
httpWebRequest.ContentLength = requestBytes.Length;
using (var requestStream = httpWebRequest.GetRequestStream())
{
requestStream.Write(requestBytes, 0, requestBytes.Length);
requestStream.Close();
}
Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null);
using (var responseStream = responseTask.Result.GetResponseStream())
{
var reader = new StreamReader(responseStream);
return reader.ReadToEnd();
}
}
您也可以使用 WebClient(它更简单一些)。此方法期望 post 参数为表单中的字符串
name1=value1&name2=value2&name3=value3
等等。因此,如果您使用此方法,请务必照此传递您的参数或将实现修改为类似于上面的代码。
static string HttpPost(string url, string Parameters)
{
var req = System.Net.WebRequest.Create(url);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream ();
os.Write (bytes, 0, bytes.Length);
os.Close ();
System.Net.WebResponse resp = req.GetResponse();
if (resp== null)
return null;
var sr = new StreamReader(resp.GetResponseStream());
return sr.ReadToEnd().Trim();
}
【讨论】:
这样的?
public string DoFormPost(string Target, string PostData)
{
//Make a request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Target);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = false;
//Put the post data into the request
byte[] data = (new ASCIIEncoding()).GetBytes(PostData);
request.ContentLength = data.Length;
Stream reqStream = request.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
//Get response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//Output response to a string
String result = "";
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
result = reader.ReadToEnd();
reader.Close();
}
return result;
}
}
【讨论】:
【讨论】:
我认为做你想做的事并不容易,但可能有一个可以接受的解决方法。 以下是一些解决方法的想法:
【讨论】:
你需要HttpWebRequest类。
【讨论】: