.net core 对创建的上下文的响应不断给我NullStream
我正在尝试为批处理请求I.NETCore2.0编写一个中间件。 到目前为止,我已经拆分了请求,将每个请求通过管道传递到控制器。 控制器返回值,但由于某种原因,我解析到控制器的已创建上下文上的响应在主体中不断给我一个空流,因此我认为我的设置中遗漏了一些内容 代码如下所示:.net core 对创建的上下文的响应不断给我NullStream,.net-core,middleware,asp.net-core-2.0,.net Core,Middleware,Asp.net Core 2.0,我正在尝试为批处理请求I.NETCore2.0编写一个中间件。 到目前为止,我已经拆分了请求,将每个请求通过管道传递到控制器。 控制器返回值,但由于某种原因,我解析到控制器的已创建上下文上的响应在主体中不断给我一个空流,因此我认为我的设置中遗漏了一些内容 代码如下所示: var json = await streamHelper.StreamToJson(context.Request.Body); var requests = JsonConvert.DeserializeObject<
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);
var json=await streamHelper.StreamToJson(context.Request.Body);
var requests=JsonConvert.DeserializeObject(json);
var responseBody=新列表();
foreach(请求中的var请求)
{
var newRequest=newhttprequestfeature
{
Body=request.Body!=null?新内存流(Encoding.ASCII.GetBytes(request.Body)):null,
Headers=context.Request.Headers,
Method=request.Method,
Path=request.RelativeUrl,
PathBase=string.Empty,
协议=context.Request.Protocol,
Scheme=context.Request.Scheme,
QueryString=context.Request.QueryString.Value
};
var newRespone=newhttpresponsefeature();
var requestLifetimeFeature=新的HttpRequestLifetimeFeature();
var features=CreateDefaultFeatures(context.features);
设置(newRequest);
功能。设置(newRespone);
features.Set(requestLifetimeFeature);
var innerContext=_factory.Create(features);
等待下一步(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" };
}
}
[路由(“api/[控制器]”)]
公共类值控制器:控制器
{
//获取api/值
[HttpGet]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
}
我发现了错误,或者是两个错误使它正常工作
首先,我必须改变我的新反应
var newRespone = new HttpResponseFeature{ Body = new MemoryStream() };
因为HttpResponseFeature在构造函数中将Body设置为Stream.Null
当这项操作完成后,Body在尝试读取时会不断给出一个空字符串。这是通过将位置设置为零来解决的
innerContext.Response.Body.Position = 0;
我发现了一个错误,或者两个错误使它工作 首先,我必须改变我的新反应
var newRespone = new HttpResponseFeature{ Body = new MemoryStream() };
因为HttpResponseFeature在构造函数中将Body设置为Stream.Null
当这项操作完成后,Body在尝试读取时会不断给出一个空字符串。这是通过将位置设置为零来解决的
innerContext.Response.Body.Position = 0;