对创建的上下文的响应不断给我 NullStream

Response on created context keeps giving me NullStream

我正在尝试为 .net core 2.0 中的批处理请求编写一个中间件。 到目前为止,我已经拆分了请求,将每个请求通过管道传递给控制器​​。 控制器 return 值,但由于某种原因,我解析到控制器的创建上下文的响应一直在主体中给我一个 NullStream,所以我认为我在设置中遗漏了一些东西。

代码如下所示:

var json = await streamHelper.StreamToJson(context.Request.Body);

var requests = JsonConvert.DeserializeObject<IEnumerable<RequestModel>>(json);

var responseBody = new List<ResponseModel>();

foreach (var request in requests)
{
    var newRequest = new HttpRequestFeature
    {
        Body = request.Body != null ? new MemoryStream(Encoding.ASCII.GetBytes(request.Body)) : null,
        Headers = context.Request.Headers,
        Method = request.Method,
        Path = request.RelativeUrl,
        PathBase = string.Empty,
        Protocol = context.Request.Protocol,
        Scheme = context.Request.Scheme,
        QueryString = context.Request.QueryString.Value
    };

    var newRespone = new HttpResponseFeature();
    var requestLifetimeFeature = new HttpRequestLifetimeFeature();

    var features = CreateDefaultFeatures(context.Features);
    features.Set<IHttpRequestFeature>(newRequest);
    features.Set<IHttpResponseFeature>(newRespone);
    features.Set<IHttpRequestLifetimeFeature>(requestLifetimeFeature);

    var innerContext = _factory.Create(features);
    await _next(innerContext);

    var responseJson = await streamHelper.StreamToJson(innerContext.Response.Body);

我不确定我在设置中遗漏了什么,因为 innerContext.Response.Body 没有设置。

我用于测试并被命中的端点之一如下所示

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

我发现了错误,或者发现了两个错误。

首先我必须将我的 newResponse 更改为

var newRespone = new HttpResponseFeature{ Body = new MemoryStream() };

因为 HttpResponseFeature 在构造函数中将 Body 设置为 Stream.Null。

完成后,Body 在尝试读取它时一直给出一个空字符串。这是通过将位置设置为零来修复的

innerContext.Response.Body.Position = 0;