.NET Framework转.NET Core Web API时如何获取HttpRequestMessage
问题解决路径说明
- 首先明确:.NET Core / .NET 5+ 的Web API体系已经抛弃了原来.NET Framework里的
HttpRequestMessage/HttpResponseMessage核心对象模型,改用Microsoft.AspNetCore.Http命名空间下的HttpRequest/HttpResponse,二者是完全独立的实现,没有官方的直接转换方法,也不建议强制做转换。 - 你原来用到的
actionContext.Request.GetConfiguration()是.NET Framework下System.Web.Http的特有API,对应的功能在.NET Core中已经被全新的配置体系和DI容器替代,不需要依赖HttpRequestMessage就能实现。
具体实现方案
针对你使用AspNetCore.CacheOutput的CacheOutputOverrideAttribute场景,有两种可行的实现方式:
方案1:通过DI直接获取配置(推荐)
CacheOutputOverrideAttribute继承自ActionFilterAttribute,你可以直接从ActionExecutingContext中拿到HttpContext,再从DI容器中取出你需要的配置对象:
public override void OnActionExecuting(ActionExecutingContext context) { // 从请求服务容器中获取配置对象 var configuration = context.HttpContext.RequestServices.GetRequiredService<IConfiguration>(); // 原来的config对应的配置项都可以直接从configuration中读取 var yourConfigValue = configuration["YourConfigKey"]; // 其余原有逻辑... base.OnActionExecuting(context); }
注意:如果需要用到原来
HttpConfiguration里的路由、格式器等配置,对应的.NET Core API都可以通过HttpContext相关属性直接获取,不需要再通过旧的GetConfiguration()入口。
方案2:兼容旧代码强制使用HttpRequestMessage(不推荐)
如果你的旧逻辑大量依赖HttpRequestMessage/HttpResponseMessage,短期内无法重构,可以引用Microsoft.AspNetCore.Mvc.WebApiCompatShim兼容包,通过以下方式构造对应的对象:
public override void OnActionExecuting(ActionExecutingContext context) { var requestMessage = context.HttpContext.Features.Get<HttpRequestMessageFeature>()?.HttpRequestMessage; if (requestMessage == null) { requestMessage = new HttpRequestMessage(); // 手动填充当前请求的方法、地址、头、内容等信息 requestMessage.Method = new HttpMethod(context.HttpContext.Request.Method); requestMessage.RequestUri = new Uri($"{context.HttpContext.Request.Scheme}://{context.HttpContext.Request.Host}{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}"); // 其余需要的属性填充... } // 调用原有依赖HttpRequestMessage的逻辑 }
该方案仅作为临时过渡方案,兼容包仅支持到.NET Core 2.1,更高版本.NET不再维护,长期来看建议直接迁移到.NET Core原生API体系。
内容的提问来源于stack exchange,提问作者Lee Z
相关产品推荐
相关产品推荐

