我正在尝试捕获原始的请求数据,并希望将请求正文内容从request对象中提取出来。
我看到有人建议做一个Request.InputStream,但是这个方法在Request对象上不可用。
你知道如何获得Request.Content主体的字符串表示吗?
发布于 2016-02-24 07:17:39
您可以通过在Request.Content
属性上调用ReadAsStringAsAsync
来获取原始数据。
string result = await Request.Content.ReadAsStringAsync();
如果你想把它放在一个字节或者一个流中,有各种各样的重载。因为这些是异步方法,所以你需要确保你的控制器是异步的:
public async Task<IHttpActionResult> GetSomething()
{
var rawMessage = await Request.Content.ReadAsStringAsync();
// ...
return Ok();
}
EDIT:如果你从这个方法接收到一个空字符串,那就意味着有别的东西已经读取了它。当它这样做时,它将指针留在末尾。执行此操作的另一种方法如下:
public IHttpActionResult GetSomething()
{
var reader = new StreamReader(Request.Body);
reader.BaseStream.Seek(0, SeekOrigin.Begin);
var rawMessage = reader.ReadToEnd();
return Ok();
}
在这种情况下,您的端点不需要是异步的(除非您有其他异步方法)
发布于 2016-11-10 18:01:00
在您对@Kenneth回答的评论中,您说ReadAsStringAsync()
返回的是空字符串。
这是因为您(或者类似模型绑定器的东西)已经阅读了内容,所以Request.Content中内部流的位置在末尾。
你能做的是:
public static string GetRequestBody()
{
var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
var bodyText = bodyStream.ReadToEnd();
return bodyText;
}
发布于 2018-12-18 05:09:58
对于其他未来的用户,他们不想让他们的控制器异步,或者不能访问HttpContext,或者正在使用dotnet核心(这是我在谷歌上找到的第一个尝试这样做的答案),下面的方法对我有效:
[HttpPut("{pathId}/{subPathId}"),
public IActionResult Put(int pathId, int subPathId, [FromBody] myViewModel viewModel)
{
var body = new StreamReader(Request.Body);
//The modelbinder has already read the stream and need to reset the stream index
body.BaseStream.Seek(0, SeekOrigin.Begin);
var requestBody = body.ReadToEnd();
//etc, we use this for an audit trail
}
https://stackoverflow.com/questions/35589539
复制相似问题