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

3
我正在测试一些 .net Core 中间件,并希望在整个 asp.net Core http 管道中运行中间件,而不是模拟它。
问题是当我使用 Feature Collection 时,某种方式 Response 对象没有被设置在 httpRequest 中,而且在 Request 自身上是只读的。
当尝试写入响应流时,此代码会抛出异常。
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();
1个回答

3
通过使用自定义特性集合,您可以排除默认构造函数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);
}

尝试重新创建默认构造函数中的操作,并添加必要的功能以便练习您的测试。
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);

通过这个单元测试,我的controller.Response被设置了,但是我的controller.Response.Headers是空的。为什么头部信息是空的呢? - jmbmage
@jmbmage 上面的示例没有设置响应头。只有请求头来满足原始代码。您需要类似地添加响应头功能,以获得所需的行为。 - Nkosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接