对创建的上下文的响应不断给我 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;
我正在尝试为 .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;