C# 在DefaultHttpContext上使用FeatureCollection时,响应对象为null

C# 在DefaultHttpContext上使用FeatureCollection时,响应对象为null,c#,asp.net-core,C#,Asp.net Core,我正在测试一些.net核心中间件,并希望使用整个asp.net核心http管道来运行中间件,而不是模拟它 问题是,当我使用Feature集合时,httpRequest中没有设置响应对象,请求本身是只读的 此代码在尝试写入响应流时引发异常 var fc = new FeatureCollection(); fc.Set<IHttpRequestFeature>(new HttpRequestFeature { Headers = new HeaderDictionary { {

我正在测试一些.net核心中间件,并希望使用整个asp.net核心http管道来运行中间件,而不是模拟它

问题是,当我使用Feature集合时,httpRequest中没有设置响应对象,请求本身是只读的

此代码在尝试写入响应流时引发异常

var fc = new FeatureCollection();
fc.Set<IHttpRequestFeature>(new HttpRequestFeature {
    Headers = new HeaderDictionary { { "RandomHeaderName", "123" } }
});
var httpContext = new DefaultHttpContext(fc);

var middleware = new RequestValidationMiddleware(
    next: async (innerHttpContext) =>
    {
        await innerHttpContext.Response.WriteAsync("test writing");
    });

middleware.InvokeAsync(httpContext).GetAwaiter().GetResult();
var fc=新功能集合();
fc.Set(新的HttpRequestFeature{
Headers=newheaderDictionary{{“RandomHeaderName”,“123”}
});
var httpContext=新的DefaultHttpContext(fc);
var middleware=新的RequestValidationMiddleware(
下一步:异步(innerHttpContext)=>
{
等待innerHttpContext.Response.WriteAsync(“测试写入”);
});
middleware.InvokeAsync(httpContext.GetAwaiter().GetResult();

通过使用自定义功能集合,您将排除由
DefaultHttpContext的默认构造函数添加的功能

public DefaultHttpContext()
    : this(new FeatureCollection())
{
    Features.Set<IHttpRequestFeature>(new HttpRequestFeature());
    Features.Set<IHttpResponseFeature>(new HttpResponseFeature());
    Features.Set<IHttpResponseBodyFeature>(new StreamResponseBodyFeature(Stream.Null));
}

public DefaultHttpContext(IFeatureCollection features)
{
    _features.Initalize(features);
    _request = new DefaultHttpRequest(this);
    _response = new DefaultHttpResponse(this);
}
public DefaultHttpContext()
:此(新功能集合())
{
Set(新的HttpRequestFeature());
Set(新的HttpResponseFeature());
Features.Set(新的StreamResponseBodyFeature(Stream.Null));
}
公共默认HttpContext(IFeatureCollection功能)
{
_特征。初始化(特征);
_请求=新的DefaultHttpRequest(此);
_响应=新的DefaultHttpResponse(此);
}
通过添加测试所需的功能,尝试重新创建在默认构造函数中完成的操作

var fc = new FeatureCollection();
fc.Set<IHttpRequestFeature>(new HttpRequestFeature {
    Headers = new HeaderDictionary { { "RandomHeaderName", "123" } }
});
//Add response features
fc.Set<IHttpResponseFeature>(new HttpResponseFeature());
var responseBodyStream = new MemoryStream();
fc.Set<IHttpResponseBodyFeature>(new StreamResponseBodyFeature(responseBodyStream ));

var httpContext = new DefaultHttpContext(fc);
var fc=新功能集合();
fc.Set(新的HttpRequestFeature{
Headers=newheaderDictionary{{“RandomHeaderName”,“123”}
});
//添加响应特性
fc.Set(新的HttpResponseFeature());
var responseBodyStream=新内存流();
fc.Set(新的StreamResponseBodyFeature(responseBodyStream));
var httpContext=新的DefaultHttpContext(fc);