私の答えは、上記のDarin Dimitrovのバリエーションです...C#のすべてのバリエーション(ASP.NET、Core、MVCなど)でバリエーションの回答が期待されます...そしておそらくVisual Studioの年(2017、2019、など)...そしてC#ではなくVisualBasicが使用されている場合...
Anders Arpiのコメントと同様に、私は提供されたDarinの回答を使用できませんでした(明らかに私の回答は彼からの直接の派生ですが)。私の場合、Request.Propertiesはオプションではありませんでしたが、Request.InputStreamはオプションでした。これは、最初の段落で述べたように、プロジェクトのタイプに強く依存していると思います。私のソリューションはVS2017でうまくいきました。
同様の回答もページにあります:ASP.NETで生の要求本文を取得する方法は?
しかし、これらは私にはうまくいきませんでした。ただし、次のような重要な手がかりを提供しました。'リクエストオブジェクトはBeginRequestイベントに入力されません。イベントのライフサイクルの後半でこのオブジェクトにアクセスする必要があります。
HTTPRequestsの構築/分析の経験がある場合は、この次の段落をスキップしてください。
振り返ってみると非常に明白ですが、リクエスト本文のコンテンツは特定のHTTPリクエストに対してのみ表示されます。GETを実行しているだけの場合(たとえば、新しいページに移動するナビゲーションタブをクリックする場合)、通常、リクエスト本文はありません。したがって、ソリューションをテストするときは、RequestBodyを含む必要があるHttpRequestを確認してください。私の場合、UIから実際にデータを受信している[送信]ボタンは、RequestBodyを含む投稿であるため、存在します(長さが0より大きい)。FiddlerまたはBurpSuiteを使用していない場合、またはShibbolethを使用している場合(Fiddler / BurpSuiteのテストが複雑になります)、Firefox開発者ツール(F12経由)でHTTPRequestを確認できます。リクエストボディの呼び出しは、Paramsおよび/またはRequestPayloadと呼ばれます。
NB Application_AuthenticateRequestは、Global.asax.cs内にあります。
(in addition to other using statements)
using System.IO;
using System.Text;
using System.Web;
protected void Application_AuthenticateRequest(object sender, EventArgs e){
HttpApplication app = (HttpApplication)sender;
// Do a quick check to make sure that we are not on local.
// I've had some odd errors on local, though I suspect general implementation will not have this issue.
// So if we're actually on a 'real' (a.k.a. non-local) website, I do the following.
using (var stream = new MemoryStream())
{
app.Request.InputStream.Seek(0, SeekOrigin.Begin);
app.Request.InputStream.CopyTo(stream);
string requestBody = Encoding.UTF8.GetString(stream.ToArray());
app.Request.InputStream.Seek(0, SeekOrigin.Begin);
if (requestBody.Length > 0) Response.Write("requestBody: " + requestBody + "<br>");
}
}
コピー後にInputStreamをリセットするために、「ReinstateMonicaCellio」の推奨事項を使用していることに注意してください。