前提・実現したいこと
初めまして。
C#(asp.netcore)を使用したAPIを作成しております。
受け取ったHttpリクエストをForwardする機能を実現したいと思っています。
C#のForwardするメソッド等を検索したところ、見当たらなかったので自力で実装しようと思っております。
その機能を実現する前段として、リクエスト時のBody値が取得できないため、質問した次第です。
補足(2021/04/12)
実現したい内容の「Forward」という言葉が曖昧であるとご指摘をいただけたため、補足させてください。
実現したい内容といたしましては以下となります。
クライアント(指定なし。ブラウザ、外部APIやアプリ等)⇔ ASP.NET Core Web アプリ(質問部)⇔ どこか他のAPIやWEBアプリ
クライアントからどこか他のWEBアプリへ送られるHttpリクエストを仲介するアプリを作成したいと思っております。
意図といたしましては、ヘッダーで指定した宛先(他のWEBアプリ)へのリクエストを時間帯によって接続不可といったような制御を行いたいためです。
あくまで制御を行いたいという目的のため、送られてきたリクエスト情報と同一のリクエスト内容をどこか他のWEBアプリ等に再度リクエストしたいのです。
また、接続不可の際にあらかじめ用意しているエラー画面を表示させたいため、MVCで実装したいと思っております。
------補足ここまで------
初学者かつ、初めての質問となります。
至らない点等ありましたらご指摘いただけると幸いです。
発生している問題・エラーメッセージ
ControllerでHttpリクエストを受け取った際に、ControllerBase.Request内のBodyの値がStreamで取得できると思いますが、リクエスト時の'Content-Type'ヘッダーに'application/x-www-form-urlencoded'を指定すると取得したStreamが空となってしまいます。
Content-Typeに'application/x-www-form-urlencoded'を指定した際にControllerBase.Request内のBodyの値を取得したいというのが本質問の趣旨となります。
'text/plain'等のContent-Typeを設定した際は取得できますので、困っている次第です。
該当のソースコード
以下、コントローラーのリクエスト受取部になります。
C#
1[Route("Test")] 2public class TestController : Controller 3{ 4 private IHttpClientFactory _clientFactory; 5 6 // DI 7 public TestController(IHttpClientFactory clientFactory) 8 { 9 _clientFactory = clientFactory; 10 } 11 12 [HttpPost] 13 public async Task<IActionResult> PostAsync([FromHeader]TestHeader header) 14 { 15 var bodyStr = string.Empty; 16 17 using(StreamReader reader = new StreamReader(Request.Body)) 18 { 19 bodyStr = await reader.ReadToEndAsync().ConfigureAwait(false); 20 } 21 22 return Ok(bodyStr); 23 } 24}
以下、リクエストはPowerShellから投げております。
PowerShell
1#読み取れるリクエスト 2Invoke-WebRequest 'http://localhost:8080/Test' ` 3 -mehtod post ` 4 -Headers @{"Content-type"="text/plain"} ` 5 -body 'hoge' 6 7#以下問題のリクエスト 8Invoke-WebRequest 'http://localhost:8080/Test' ` 9 -mehtod post ` 10 -Headers @{"Content-type"="application/x-www-form-urlencoded"} ` 11 -body 'hoge' # 本来は"aaa=aaa&bbb=bbb"のような値を送りたい。
試したこと
Postメソッドの引数に'[FromForm]'を指定すれば解決するのですが、Bodyの型を指定したくなく、すべてのリクエストに対応したいためあえてStreamを読み込んでおります。
前提に書きました通り、他のContent-Type(text/plain, text/xml, application/json等)で試行しております。その際は文字列は返却できておりました。
またStreamを読み込んだ時点で値が空となりますので、リクエスト返却時ではなくリクエスト受付時の問題と認識しております。
stackoverflowにてForwardを実装している記事を見たのですが、mvcではなくWebHttpRequestを利用したものとなっており、本問題には使えないかなと思い手詰まりとなってしまいました。
該当URL:stackoverflowのリンク
明確な質問とならず申し訳ございません。
ご助力いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
言語:C#
フレームワーク:.NetCore3.1
実行環境:VisualStudioProfessional2019 Version 16.8.5内のIISExpress
回答1件
あなたの回答
tips
プレビュー