如何在 ASP.NET 中以编程方式模拟 HTTP POST? [英] How to simulate HTTP POST programmatically in ASP.NET?

查看:16
本文介绍了如何在 ASP.NET 中以编程方式模拟 HTTP POST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要以编程方式模拟一个 HTTP POST,即我需要生成一个带有一些 POST 变量的请求,然后将其发送到一个页面.

I need to simulate an HTTP POST programmatically, i.e., I need to generate a Request with some POST variables and then send it to a page.

澄清一下,我需要模拟常规 POST 的行为,而不是以编程方式完成整个事情.所以基本上我需要以与发生表单 POST 时填写的相同方式填写请求,然后将浏览器发送到需要 POST 的页面.

To clarify, I need to simulate the behaviour of a regular POST, not do the whole thing programmatically. So basically I need to fill in a Request in the same way it would be filled if a form POST was happening, and then send the browser to the page that expects the POST.

推荐答案

这是一种方法.

您以 NameValueCollection 的形式向该方法发送 url 和名称/值参数.该方法在端点上创建一个 Http Post 并以字符串形式返回响应.

You send this method the url and the name/value parameters in the form of a NameValueCollection. The method makes a Http Post on the endpoint and returns the response as a string.

当然,根据您这样做的原因/原因以及调用此方法的次数,可能还有其他选择.但是,除非您提供有关您的特定需求的更多信息,否则这种方法就足够了.

Of course depending on what/why you're doing this and how many times this method will be called, there maybe other alternatives. But until you provide more information on your specific needs, this method is good enough.

下面的方法使用任务 (.NET 4.0) 和异步方法,因此如果您在循环中进行多次调用,那么它会比同步方法快,如下一个代码清单.

The method below uses Tasks (.NET 4.0) and the async methods so it will be faster then a synchronous method like the next code listing if you're making multiple calls in a loop for example.

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 参数为表单中的字符串

you could also use WebClient (it's bit simpler). This method expects the post parameters as a string in the form

name1=value1&name2=value2&name3=value3

等等.因此,如果您使用此方法,请务必按原样传入参数或将实现修改为与上面的代码类似.

etc. So if you use this method be sure to pass in your parameters as such or modify the implementation to be like the code above.

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();
}

这篇关于如何在 ASP.NET 中以编程方式模拟 HTTP POST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆