如何从HttpRequest对象获取HttpRequestMessage对象?
如何从HttpRequest对象获取HttpRequestMessage对象?
嘿,这个场景我太熟悉了!当你在Web API控制器里拿到的是HttpRequest对象,但手头的库偏偏需要HttpRequestMessage时,其实有几种实用的解决办法,分情况给你说说:
如果是在传统ASP.NET Web API框架中
其实这里有点小误区——传统Web API控制器的Request属性本身就是HttpRequestMessage类型的,如果你看到的是HttpRequest,可能是不小心引用错了命名空间?或者是在混合了MVC和Web API的项目里?如果确实拿到的是HttpRequest,可以通过HttpContext的扩展方法来获取对应的HttpRequestMessage:using System.Net.Http; using System.Web.Http; var httpRequestMessage = Request.GetHttpRequestMessage();这个扩展方法在
System.Web.Http命名空间下,记得要引用对应的程序集哦。如果是在ASP.NET Core中
Core里的HttpRequest和HttpRequestMessage属于不同的抽象体系,没有直接的内置转换方法,不过你可以手动构建一个HttpRequestMessage,把HttpRequest里的关键信息映射过去:using System.Net.Http; using Microsoft.AspNetCore.Http; public HttpRequestMessage ConvertToHttpRequestMessage(HttpRequest request) { var requestMessage = new HttpRequestMessage(); var requestMethod = new HttpMethod(request.Method); requestMessage.Method = requestMethod; // 构建请求URI var requestUri = new Uri($"{request.Scheme}://{request.Host}{request.Path}{request.QueryString}"); requestMessage.RequestUri = requestUri; // 复制请求头 foreach (var header in request.Headers) { requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); } // 如果需要处理请求体,得额外读取流(注意:读取流后要重置位置,避免后续中间件出问题) if (request.ContentLength > 0 && request.Body.CanRead) { request.Body.Position = 0; requestMessage.Content = new StreamContent(request.Body); foreach (var header in request.ContentType) { requestMessage.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); } } return requestMessage; }这个方法会把请求的方法、URI、头信息甚至请求体都复制到新的
HttpRequestMessage里,基本能满足大部分库的需求。
另外要注意,如果你的库是专门为传统Web API设计的,在Core里使用可能还要考虑其他兼容性问题,但单纯转换请求对象的话,上面的方法应该够用啦。
备注:内容来源于stack exchange,提问作者James McCormack
相关产品推荐
相关产品推荐

