Как симулировать HTTP POST программно в ASP.NET? - PullRequest
11 голосов
/ 23 февраля 2011

Мне нужно программно моделировать HTTP POST, то есть мне нужно сгенерировать запрос с некоторыми переменными POST и затем отправить его на страницу.

Чтобы уточнить, мне нужно смоделировать поведение обычного POST, а не делать все это программно. Таким образом, в основном мне нужно заполнить запрос таким же образом, как он будет заполнен, если бы выполнялась форма POST, а затем отправить браузер на страницу, которая ожидает POST.

Ответы [ 5 ]

19 голосов
/ 23 февраля 2011

Вот один из способов сделать это.

Этот метод отправляет URL-адрес и параметры имя / значение в форме NameValueCollection.Метод создает сообщение Http Post на конечной точке и возвращает ответ в виде строки.

Конечно, в зависимости от того, что / почему вы делаете это и сколько раз будет вызываться этот метод, могут быть другие альтернативы.Но пока вы не предоставите больше информации о ваших конкретных потребностях, этот метод достаточно хорош.

В приведенном ниже методе используются задачи (.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 (это немного проще).Этот метод ожидает параметры записи в виде строки в форме

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();
}
3 голосов
/ 23 февраля 2011

Как то так?

    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;
        }
    }
1 голос
/ 04 декабря 2012

Я не думаю, что легко делать то, что вы хотите, но может быть приемлемый обходной путь.Вот некоторые идеи для обходных путей:

  • Верните javascript в браузер вместе с формой, которую вы хотите опубликовать, и пусть javascript сделает сообщение за вас.Однако это небезопасно.
  • Если страница назначения находится под вашим контролем, передайте данные через HttpContext.Current.Items, вызовите Transfer и попросите страницу назначения распознать этот особый случай и обработать его.Одним из преимуществ использования HttpContext.Current.Items является то, что он очищается автоматически в конце запроса, в отличие от состояния сеанса.
  • HttpServerUtility.Execute может быть полезным, если вы хотите встроить результаты с другой страницы в текущую.стр.Он не позволяет устанавливать данные публикации формы или параметры запроса URL.
  • Запустите HttpWebRequest, как описано в других ответах, и используйте Response.Write, чтобы вернуть его в качестве ответа с веб-страницы.Вам также может потребоваться предоставить учетные данные для аутентификации пользователей и файлы cookie.См. HttpWebRequest.Credentials и HttpWebRequest.CookieContainer.
  • Если вы можете изменить целевую страницу, чтобы она отображала ту же информацию, если ее повторно запрашивать, вы можете выполнить HttpWebRequest и следовать за ним с перенаправлением дляв браузере.
  • Измените код, чтобы любая страница могла генерировать одинаковый вывод (например, с помощью общего UserControl или пользовательского WebControl).
  • Очистка страницы может быть полезна, если страница назначения включенадругой сайт.Сделайте запрос, очистите результаты и покажите результаты на своей странице.
1 голос
/ 23 февраля 2011

Я задавал этот вопрос в прошлом здесь:

ПОСЛАТЬ HTML-форму программно?

Меня перенаправили по следующей ссылке, которая отлично сработала для меня!:

WebClient.UploadValues ​​

0 голосов
/ 23 февраля 2011

Вам нужно HttpWebRequest класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...