2013-11-22 28 views
31

我正在使用Mailgun API。有一部分我需要爲他們提供一個URL,然後他們將HTTP發佈一些數據給我。如何獲取C#中的HTTP發佈數據?

我向Mailgun提供此URL(http://test.com/MailGun/Webhook.aspx),以便他們可以發佈數據。我有他們正在發送的參數名稱列表(收件人,域,IP,...)。

我不確定如何在我的頁面中發佈數據。 在Webhook.aspx頁面中,我嘗試了一些代碼,如下所示,但它們都是空的。

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

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

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

不知道該如何獲得發佈的數據?

+0

您可以嘗試使用招追查後的數據,看看什麼樣的參數,你的頁面正在從請求 – eloycm

+0

檢查了這一點? Request.Form.AllKeys –

+0

@AhmetKakıcı它是空的。 – Alma

回答

35

此代碼將列出在POST中發送的所有表單變量。通過這種方式,您可以查看您是否擁有帖子值的正確名稱。

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

@詹姆斯,沒有任何顯示它是空的。 – Alma

+6

@eloycm是的,提琴手在本地會很好,但是聽起來像POST請求從外部源進入服務器。 –

+0

這個答案相當不錯 - 除了編寫響應部分 - 如果Mailgun得到一個變量列表,它不會對Alma有好處。 –

0

在Web瀏覽器中,打開開發人員控制檯(Chrome和IE中的F12),然後打開網絡選項卡並查看請求和響應數據。另一種選擇 - 使用Fiddler(http://fiddler2.com/)。

當您在發送到您的頁面時看到POST請求時,請查看查詢字符串和標題。你會看到你的數據是以查詢字符串還是以表單的形式出現 - 或者根本沒有發送到你的頁面。

UPDATE:對不起,必須先查看MailGun API,它們不會通過瀏覽器,請求直接來自其服務器。當您從MailGun獲得POST時,您必須調試並檢查Request.Params的所有成員。

+0

我用F12和網絡選項卡,我沒有看到任何關於這個參數在哪裏應該找他們? – Alma

+0

我不知道關於資源管理器,當然不是Web開發的最佳工具,我也沒有看到那裏的帖子參數(我很少使用IE)。另一個不錯的選擇是Firefox上的螢火蟲,在那裏你得到所有傳遞給頁面的帖子參數 – eloycm

+0

謝謝@eloycm,我現在正在安裝Firefox。 – Alma

6

您可以簡單地使用Request["recipient"]

要從查詢字符串,表單,Cookie或ServerVariables訪問數據 收集到「Web請求期間讀取客戶端發送的HTTP值」,你可以寫請求[ 「鑰匙」]

來源: MSDN

更新:總結交談

爲了查看MailGun發佈到您網站的值,您需要從MailGun製作的Web請求中讀取這些值,並將它們記錄在某個地方,然後將它們顯示在您的頁面上。

您應該有一個端點,MailGun將在其中發送POST值,另一個頁面用於查看記錄的值。

現在看來,你有一個頁面。因此,當您查看此頁面並且您閱讀了請求值時,您正在從您的請求中讀取值,而不是MailGun。

+0

這個請求[「收件人」]也是空的。 – Alma

+0

問題是他不知道發送到頁面的參數的真實姓名 – eloycm

+0

在這種情況下,@詹姆斯的解決方案將有幫助 –

27

該代碼從HTTP請求中讀取原始輸入流。如果數據在Request.Form或其他模型綁定中不可用,或者您需要訪問字節/文本,請使用它。

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

使用此:

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

試試這個

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]]; 
} 
2

你缺少一個步驟。你需要記錄/存儲你的服務器上的值(mailgun是一個客戶端)。然後你需要在你的服務器上檢索這些值(你的電腦與你的網絡瀏覽器將成爲一個客戶端)。這些將是兩個完全不同的aspx文件(或具有不同參數的相同文件)。

aspx頁面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);