c# - await actionContext.Request.Content.ReadAsStringAsync() 返回一个空字符串
问题描述
首先
var myString = await actionContext.Request.Content.ReadAsStringAsync();
应该总是工作。但事实并非如此。开始了:
飞机控制器.cs
[ValidateAirplane]
[HydrateAirplane]
public class AirplaneController : ApiController
ValidateAirplane.cs(见神奇的魔法线)
public class ValidateAirplaneAttribute : FilterAttribute, IAuthorizationFilterpublic class ValidateAirplaneAttribute : FilterAttribute, IAuthorizationFilter
...
public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
var json = await actionContext.Request.Content.ReadAsStringAsync(); // <-- amazing magic line
return await continuation();
}
HydrateAirplane.cs
public class HydrateAirplaneAttribute : FilterAttribute, IActionFilter
...
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
var json = await actionContext.Request.Content.ReadAsStringAsync();
return await continuation();
}
如果我注释掉amazing magic line
then json
inExecuteAuthorizationFilterAsync
作为空字符串返回。但是,如果我不注释掉,amazing magic line
我会得到 json(来自客户端的飞机 JSON)。
起初我认为这可能是一个时间问题,所以我在尝试读取 json 之前尝试了一个await Task.Delay(5000)
in ,但它没有效果。HydrateAirplane.cs
知道问题是什么吗?
解决方案
这更像是一种解决方法而不是答案。如果您有更好的答案,请分享。我注意到有一个ReadAsStreamAsync
,我能够让它工作。也许这是 WebAPI 中的错误?我在github上找不到代码,所以我不确定。我的解决方法是使用此扩展方法而不是ReadAsStringAsync
:
public async static Task<string> GetRequestBody(this HttpActionContext actionContext)
{
var bodyStream = await actionContext.Request.Content.ReadAsStreamAsync();
bodyStream.Position = 0;
var bytes = new byte[bodyStream.Length];
await bodyStream.ReadAsync(bytes, 0, bytes.Length);
bodyStream.Position = 0; // <-- i don't know why but this line is important. it doesn't work on subsequent calls without this. ...to be clear, it absolutely should work. i consider this to be a WebAPI work around. that is, i should not have to ever even think about this.
return Encoding.ASCII.GetString(bytes);
}
this 没有包含在 using 中的原因是它被包含在 using 中,但是 WebAPI 开始抛出流不可读错误,我猜这意味着它们使用与内部返回给您的完全相同的流。
推荐阅读
- powershell - 以编程方式获取 SharePoint Online 系统页面 html 内容
- node.js - MongoDb 没有与 express 连接
- php - 避免对 MySQL 日期时间列进行不必要的时间戳转换
- javascript - 将获取的结果自动翻译成 navigator.language
- powershell - Powershell Select 具有变量的属性为
- linux - 如何使用 SH 从文本填充创建列表?
- flutter - 需要用 Provider 更新 TextController
- html - 如何在不同大小的列中显示文章的不同部分?
- react-native - React Native Linking openURL:使用特殊字符,如 # 和 *
- r - 将一列中的值添加到另一列中的值