You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的功能,仅需要调整对应接口的返回类型与返回逻辑即可。

核心修改点

  1. 将GetOrder方法的返回类型从OrderDTO调整为ActionResult<OrderDTO>,支持返回不同状态码的响应
  2. 将原First查询改为FirstOrDefault,否则查询不到匹配数据时会直接抛出序列异常,无法进入order == null的判断分支
  3. 404未找到场景直接调用NotFound()方法返回响应
  4. 201创建成功场景调用CreatedAtAction()方法返回响应,自动填充201状态码与Location响应头
  5. 400参数错误场景直接调用BadRequest()方法返回响应
  6. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:05