ASP.NET獲取Request當下所有的HTTP傳入資訊

有時候會臨時需要拿取當下傳入的HTTP GET、HTTP POST完整資訊進行分析,再安裝一套封包捕捉軟體也太小題大作了,因此把一些常用的資訊列舉在此,以利要應用的時候可以快速查詢。

HTTP Headers

可以從Request.Headers拿到,可以查看例如:Accept-EncodingContent-LengthContent-Type此類的資訊,以下是簡單的查詢範例:

var cHeaders = string.Join(
  "\r\n",
  Request.Headers.AllKeys
    .Select(x => $"{x}: {Request.Headers[x]}")
    .ToArray()
  );

HTTP InputStream

在Headers的後段,自然就是Body主資料表述段的部分了,如果想要完整的知道打過來的本文,可以試著從Request.InputStream拿取,由於可能會涉及到二進制的表述(例如POST Files過來你這邊),因此我們會將其存成檔案後再打開分析。如果是POST multipart/form-dat格式,cBody裡面的內文有可能會出現RFC2388的boundary資料。

if (Request.HttpMethod == "POST")
{
  using var oSR = new System.IO.StreamReader(Request.InputStream);
  var cBody = oSR.ReadToEnd();
}

接下來就是ASP.NET後端的機制,自動將Request.InputStream解析成程式設計師好操控的物件:

HTTP Form

下列的程式碼可以透過物件檢視傳遞進入的表單欄位名稱與數值:

var cFormFields = string.Join(
  "\r\n",
  Request.Form.AllKeys
    .Select(x => $"{x}= {Request.Form[x]}")
    .ToArray()
  );

HTTP Files

有時候前端也會透過POST傳遞多重檔案,可以透過下列指令將其全部儲存。

if (Request.Files.Count > 0)
{
  Request.Files.AllKeys
    .ToList()
    .ForEach(x =>
    {
      var oFile = Request.Files[x];
      if (oFile != null && oFile.ContentLength > 0)
      { oFile.SaveAs($@"D:\XXXX\{oFile.FileName}"); }
    });
}
ASP.NET WebForm MVC HttpGet HttpPost HttpHeaders Forms Files