回答編集履歴

1

追記

2021/04/13 02:36

投稿

退会済みユーザー
test CHANGED
@@ -1 +1,65 @@
1
1
  「Bodyから値を取得」とのことですが、MVC で受け取ってそれをそのまま「どこか他のAPIやWEBアプリ」に投げるということですか? それは全く普通ではない、少なくとも私の理解のはるか斜め上のことを考えておられるような気がします。時間制限するのが目的とのことですが、それだけならプロキシサーバーでも間に入れるとか、別の手段を考えた方が良いのでは?
2
+
3
+
4
+
5
+ **【追記】**
6
+
7
+
8
+
9
+ 下の 2021/04/13 10:47 の私のコメントで「後で回答欄に書いておきます」と書いた件です。
10
+
11
+
12
+
13
+ コメント欄で紹介した stackoverflow の記事 (URL 下記) の回答を検証してみました。それに書いてあるようにして Body から文字列を取得できます。
14
+
15
+
16
+
17
+ How to read ASP.NET Core Response.Body?
18
+
19
+ [https://stackoverflow.com/questions/43403941/how-to-read-asp-net-core-response-body](https://stackoverflow.com/questions/43403941/how-to-read-asp-net-core-response-body)
20
+
21
+
22
+
23
+ startup.cs の Configure メソッドに**ミドルウェアとして**以下を登録。Controller では効果は無いようです。
24
+
25
+
26
+
27
+ ```
28
+
29
+ app.Use(async (context, next) => {
30
+
31
+ context.Request.EnableBuffering();
32
+
33
+ await next();
34
+
35
+ });
36
+
37
+ ```
38
+
39
+
40
+
41
+ application/x-www-form-urlencoded 形式でデータを POST。下の画像は Fiddler で見た要求ヘッダとボディ。
42
+
43
+
44
+
45
+ ![イメージ説明](a8e6bcf2228f23d03cda2b9e9a7faee7.jpeg)
46
+
47
+
48
+
49
+ アクションメソッドで HttpRequest.Body を取得。Position が末尾になっているので巻き戻してから(Position を 0 に設定してから)StreamReader で読むと Body の文字列を取得できます。。
50
+
51
+
52
+
53
+ ![イメージ説明](cf81420b075bcb059c19ed6c8f33bd4b.jpeg)
54
+
55
+
56
+
57
+ デフォルトでは 1 回しか Body から読めないが、アクションメソッドで Body を取得する時点ではすでに読んでしまっているので Body から読めないということのようです。
58
+
59
+
60
+
61
+ 上のようにすればアクションメソッドで巻き戻してもう一回読むことは可能です。ただし、わざわざそうしているのは "to make the default configuration of request handling as lightweight and performant as possible" ということだそうで、性能上の劣化が生じる可能性はあるかも。
62
+
63
+
64
+
65
+ あと、問題とは直接関係ない話ですが、stackoverflow の記事に書いてあるように、using は使わない、取得し終わったら Stream を巻き戻すようにするのがよいかもしれません。