Как имитировать HTTP POST программно в ASP.NET?
Мне нужно симулировать HTTP POST программно, то есть мне нужно сгенерировать запрос с некоторыми переменными POST, а затем отправить его на страницу.
Чтобы уточнить, мне нужно смоделировать поведение регулярного POST, а не делать все это программно. Поэтому в основном мне нужно заполнить запрос так же, как он будет заполнен, если произойдет POST-форма, а затем отправить браузер на страницу, которая ожидает POST.
Ответы
Ответ 1
Вот один из способов сделать это.
Вы отправляете этот метод URL-адрес и параметры имени/значения в форме NameValueCollection. Метод делает Http-сообщение на конечной точке и возвращает ответ в виде строки.
Конечно, в зависимости от того, что/почему вы делаете это и сколько раз этот метод будет вызван, могут быть и другие альтернативы. Но пока вы не предоставите больше информации о ваших конкретных потребностях, этот метод достаточно хорош.
В приведенном ниже методе используются задачи (.NET 4.0) и методы async, поэтому он будет быстрее, чем синхронный метод, например следующий код, если вы делаете несколько вызовов в цикле, например.
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();
}
Ответ 2
Что-то вроде этого?
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;
}
}
Ответ 3
Я задал этот вопрос в прошлом:
ПРОГРАММА HTML-формы программно?
Я был перенаправлен на следующую ссылку, которая отлично поработала для меня!:
WebClient.UploadValues
Ответ 4
Я не думаю, что легко сделать то, что вы хотите, но может быть приемлемым обходным решением.
Вот некоторые идеи обходных решений:
- Верните javascript в браузер вместе с формой, которую вы хотите опубликовать, и пусть javascript сделает эту запись для вас. Однако это не безопасно.
- Если целевая страница находится под вашим контролем, передайте данные через HttpContext.Current.Items, вызовите Transfer, а целевая страница распознает этот специальный случай и обрабатывает его. Одним из преимуществ использования HttpContext.Current.Items является то, что он очищается автоматически в конце запроса, в отличие от состояния сеанса.
- HttpServerUtility.Execute может быть полезна, если вы хотите вставлять результаты с другой страницы на текущую страницу. Он не позволяет вам устанавливать данные сообщения формы или параметры URL-запроса.
- Запустите HttpWebRequest, как описано в других ответах, и используйте Response.Write, чтобы вернуть это как ответ с вашей веб-страницы. Вам также может потребоваться предоставить учетные данные пользователей и файлы cookie. См. HttpWebRequest.Credentials и HttpWebRequest.CookieContainer.
- Если вы можете изменить целевую страницу, чтобы она отображала ту же информацию, если она запрошена повторно, вы можете выполнить HttpWebRequest и следовать ей с помощью Redirect для браузера.
- Рефакторинг кода, чтобы любая страница могла генерировать один и тот же результат (например: с помощью общего UserControl или настраиваемого WebControl).
- Скребок страницы может быть полезен, если целевая страница находится на другом сайте. Сделайте запрос, очистите результаты и покажите результаты на своей собственной странице.
Ответ 5
Вам нужен HttpWebRequest класс.