ASP.NET Core ControllerBase中无法使用HttpResponseException与Request.CreateResponse求助
问题根源
你当前使用的是ASP.NET Core框架,HttpResponseException与Request.CreateResponse均为旧版.NET Framework体系下ASP.NET Web API的专属API,ASP.NET Core中已经完全移除了这两个特性,因此无法直接使用。
适配方案
ASP.NET Core中ControllerBase基类内置了一系列标准化的状态码返回方法,可以完全替代上述两个旧API的功能,仅需要调整对应接口的返回类型与返回逻辑即可。
核心修改点
- 将
GetOrder方法的返回类型从OrderDTO调整为ActionResult<OrderDTO>,支持返回不同状态码的响应 - 将原
First查询改为FirstOrDefault,否则查询不到匹配数据时会直接抛出序列异常,无法进入order == null的判断分支 - 404未找到场景直接调用
NotFound()方法返回响应 - 201创建成功场景调用
CreatedAtAction()方法返回响应,自动填充201状态码与Location响应头 - 400参数错误场景直接调用
BadRequest()方法返回响应 - 修正
PostOrder方法的异步逻辑,将同步SaveChanges改为异步SaveChangesAsync匹配方法的async修饰符
修改后完整代码
using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using ElevenCherryBackEnd.Entities; using ElevenCherryBackEnd.Helpers; namespace ElevenCherryBackEnd.Controllers { [Route("api/[controller]")] [ApiController] public class OrdersController : ControllerBase { private readonly OrdersContext _context; public OrdersController(OrdersContext context) { _context = context; } // GET: api/Orders [HttpGet] public IEnumerable<Order> GetOrders() { return _context.Orders.Where(o => o.Customer == User.Identity.Name); } // GET: api/Orders/5 [HttpGet("{id}")] public ActionResult<OrderDTO> GetOrder(int id) { Order order = _context.Orders.Include("OrderDetails.Product") .FirstOrDefault(o => o.Id == id && o.Customer == User.Identity.Name); if (order == null) { return NotFound(); } return new OrderDTO() { Details = from d in order.OrderDetails select new OrderDTO.Detail() { ProductID = d.Product.Id, Product = d.Product.Name, Price = d.Product.Price, Quantity = d.Quantity } }; } // POST: api/Orders [HttpPost] public async Task<ActionResult<Order>> PostOrder(OrderDTO dto) { if (ModelState.IsValid) { var order = new Order() { Customer = User.Identity.Name, OrderDetails = (from item in dto.Details select new OrderDetail() { ProductId = item.ProductID, Quantity = item.Quantity }).ToList() }; _context.Orders.Add(order); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetOrder), new { id = order.Id }, order); } return BadRequest(ModelState); } } }
内容的提问来源于stack exchange,提问作者Dateka
相关产品推荐
相关产品推荐

