首页 > 解决方案 > 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 linethen jsoninExecuteAuthorizationFilterAsync作为空字符串返回。但是,如果我不注释掉,amazing magic line我会得到 json(来自客户端的飞机 JSON)。

起初我认为这可能是一个时间问题,所以我在尝试读取 json 之前尝试了一个await Task.Delay(5000)in ,但它没有效果。HydrateAirplane.cs

知道问题是什么吗?

标签: c#asp.net-web-apiasp.net-web-api2

解决方案


这更像是一种解决方法而不是答案。如果您有更好的答案,请分享。我注意到有一个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 开始抛出流不可读错误,我猜这意味着它们使用与内部返回给您的完全相同的流。


推荐阅读