【问题标题】:How to Get the HTTP Post data in C#?如何在 C# 中获取 HTTP Post 数据?
【发布时间】:2013-11-22 18:04:06
【问题描述】:

我正在使用 Mailgun API。有一个部分我需要向他们提供一个 URL,然后他们会通过 HTTP 向我发布一些数据。

我将此 URL (http://test.com/MailGun/Webhook.aspx) 提供给 Mailgun,以便他们可以发布数据。我有一个他们发送的参数名称列表(收件人、域、IP、...)。

我不确定如何在我的页面中获取发布的数据。 在 Webhook.aspx 页面中,我尝试了如下一些代码,但它们都是空的。

 lblrecipient.text= Request.Form["recipient"];

 lblip.Text= Request.Params["ip"];

 lbldomain.Text = Request.QueryString["domain"];

不确定如何尝试获取发布的数据?

【问题讨论】:

  • 你可以尝试使用fiddler来追踪post数据,看看你的页面从请求中得到了什么样的参数
  • 看看这个? Request.Form.AllKeys
  • @AhmetKakıcı 它是空的。

标签: c# asp.net http-post


【解决方案1】:

此代码将列出在 POST 中发送的所有表单变量。这样您就可以查看您是否拥有帖子值的正确名称。

string[] keys = Request.Form.AllKeys;
for (int i= 0; i < keys.Length; i++) 
{
   Response.Write(keys[i] + ": " + Request.Form[keys[i]] + "<br>");
}

【讨论】:

  • @eloycm 是的,fiddler 在本地会很好,但听起来 POST 请求是从外部源进入服务器的。
  • 这个答案很好——除了写响应部分——如果Mailgun得到一个变量列表,它对Alma没有好处。
【解决方案2】:

此代码从 HTTP 请求中读取原始输入流。如果数据在 Request.Form 或其他模型绑定中不可用,或者如果您需要访问字节/文本,请使用它。

using(var reader = new StreamReader(Request.InputStream))
    content = reader.ReadToEnd();

【讨论】:

    【解决方案3】:

    您可以简单地使用Request["recipient"] 来“读取客户端在 Web 请求期间发送的 HTTP 值”

    从 QueryString、Form、Cookie 或 ServerVariables 访问数据 集合,可以写Request["key"]

    来源: MSDN

    更新:总结对话

    为了查看 MailGun 发布到您网站的值,您需要从 MailGun 发出的网络请求中读取它们,将它们记录在某处,然后将它们显示在您的页面上。

    您应该有一个端点,MailGun 会将 POST 值发送到该端点,以及用于查看记录值的另一个页面。

    现在您似乎只有一页。因此,当您查看此页面并读取请求值时,您正在读取您的请求中的值,而不是 MailGun。

    【讨论】:

    • 这个请求["recipient"] 也是空的。
    • 问题是他不知道发送到页面的参数的真实姓名
    • 在这种情况下@James 的解决方案会有所帮助
    • @eloycm 其实我知道发送到页面的参数名称
    • 听上去,您有一个外部服务正在向您发送数据。您可能在页面上有一个按钮,该按钮会导致 MailGun 上的事件。 MailGun 然后用一些数据点击你的 URL。请让我知道这是否接近正在发生的事情。
    【解决方案4】:

    你少了一个步骤。您需要在服务器上记录/存储值(mailgun 是客户端)。然后你需要在你的服务器上检索这些值(你的电脑和你的网络浏览器将是一个客户端)。这将是两个完全不同的 aspx 文件(或具有不同参数的同一个文件)。

    aspx page 1(mailgun 有的那个):

    var val = Request.Form["recipient"];
    var file = new File(filename);
    file.write(val);
    close(file);
    

    aspx 第 2 页:

    var contents = "";
    if (File.exists(filename))
      var file = File.open(filename);
      contents = file.readtoend();
      file.close()
    
    Request.write(contents);
    

    【讨论】:

      【解决方案5】:

      使用这个:

          public void ShowAllPostBackData()
          {
              if (IsPostBack)
              {
                  string[] keys = Request.Form.AllKeys;
                  Literal ctlAllPostbackData = new Literal();
                  ctlAllPostbackData.Text = "<div class='well well-lg' style='border:1px solid black;z-index:99999;position:absolute;'><h3>All postback data:</h3><br />";
                  for (int i = 0; i < keys.Length; i++)
                  {
                      ctlAllPostbackData.Text += "<b>" + keys[i] + "</b>: " + Request[keys[i]] + "<br />";
                  }
                  ctlAllPostbackData.Text += "</div>";
                  this.Controls.Add(ctlAllPostbackData);
              }
          }
      

      【讨论】:

        【解决方案6】:

        在网络浏览器中,打开开发者控制台(Chrome 和 IE 中的 F12),然后打开网络选项卡并查看请求和响应数据。另一种选择 - 使用 Fiddler (http://fiddler2.com/)。

        当您看到 POST 请求被发送到您的页面时,请查看查询字符串和标题。您将看到您的数据是来自查询字符串还是表单 - 或者根本没有发送到您的页面。

        更新:抱歉,必须先查看 MailGun API,它们不会通过您的浏览器,请求直接来自它们的服务器。当您从 MailGun 获得 POST 时,您必须调试和检查 Request.Params 的所有成员。

        【讨论】:

        • 我使用了 F12 和 Network 选项卡,我没有看到任何参数在这里应该在哪里寻找它们?
        • 我不知道 explorer,肯定不是最好的 web 开发工具,我也看不到 post 参数(反正我很少用 IE)。另一个不错的选择是 firefox 上的 firebug,在那里您可以将所有 post 参数传递给页面
        • 谢谢@eloycm,我现在正在安装firefox。
        • @eloycm,在 Firefox 中,我可以看到响应标头和请求标头,这是我应该看到发布到此页面的参数的地方吗?我在这里没有看到任何我有名字的参数:(
        • 在 Firefox 中,如果您展开请求(单击左侧的小十字),您将看到标题,然后是帖子选项卡,在帖子选项卡中您应该会看到参数列表
        【解决方案7】:

        试试这个

        string[] keys = Request.Form.AllKeys;
        var value = "";
        for (int i= 0; i < keys.Length; i++) 
        {
           // here you get the name eg test[0].quantity
           // keys[i];
           // to get the value you use
           value = Request.Form[keys[i]];
        }
        

        【讨论】:

          【解决方案8】:

          在我的情况下,因为我将帖子数据分配给了标题,这就是我获取它的方式:

          protected void Page_Load(object sender, EventArgs e){
              ...
              postValue = Request.Headers["Key"];
          

          这就是我将值和密钥附加到POST 的方式:

          var request = new NSMutableUrlRequest(url){
              HttpMethod = "POST", 
              Headers = NSDictionary.FromObjectAndKey(FromObject(value), FromObject("key"))
          };
          webView.LoadRequest(request);
          

          【讨论】:

            【解决方案9】:

            您可以尝试检查“Request.Form.Keys”。如果它不能正常工作,你可以使用'request.inputStream'来获取soap字符串,它会告诉你所有的请求键。

            【讨论】:

            • 这两个答案已包含在此问题的先前答案中。回答时一定要提供新的答案,最好提供一个示例,说明如何在原始问题的上下文中使用它。
            猜你喜欢
            • 2017-12-04
            • 1970-01-01
            • 2019-01-28
            • 2017-12-14
            • 2018-02-26
            • 1970-01-01
            • 2017-02-24
            • 2011-08-14
            • 1970-01-01
            相关资源
            最近更新 更多