Microsoft.AspNetCore.Mvc.ControllerBase.Request
返回 null
的情况通常发生在尝试访问请求对象时,但当前上下文中并没有可用的请求。这种情况可能由以下几个原因造成:
在 ASP.NET Core 中,ControllerBase.Request
属性提供了对当前 HTTP 请求的访问。这个属性是通过依赖注入自动填充的,它依赖于中间件来设置请求管道。
null
。null
。Request
属性可能会返回 null
。Request
属性可能为 null
。public async Task<IActionResult> MyAction()
{
await Task.Delay(1000); // 模拟异步操作
var request = Request; // 此时应该不会为 null
// ...
}
确保自定义中间件在设置请求上下文之后执行。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 确保 UseRouting 在自定义中间件之前调用
app.UseRouting();
app.UseMiddleware<MyCustomMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
[Test]
public async Task TestMyAction()
{
var mockHttpContext = new Mock<HttpContext>();
mockHttpContext.SetupGet(x => x.Request).Returns(new DefaultHttpRequest(new DefaultHttpContext()));
var controller = new MyController();
controller.ControllerContext = new ControllerContext(new ActionContext(mockHttpContext.Object, new RouteData(), controller));
var result = await controller.MyAction();
// 断言和验证结果
}
如果控制器依赖于请求上下文,可以考虑使用构造函数注入来确保请求对象在控制器实例化时可用。
public class MyController : ControllerBase
{
private readonly HttpRequest _request;
public MyController(HttpRequest request)
{
_request = request;
}
public IActionResult MyAction()
{
// 使用 _request 而不是 ControllerBase.Request
return Ok();
}
}
通过上述方法,可以有效地解决 Microsoft.AspNetCore.Mvc.ControllerBase.Request
返回 null
的问题。如果问题仍然存在,建议检查应用程序的其他部分,确保请求上下文在整个请求管道中正确设置和传递。
没有搜到相关的沙龙