我正在尝试同时支持Web API和普通控制器。
我为不同的动作定义了不同的方法,但由于我一遍又一遍地追随错误,所以看起来有些错误。>
{"Message":"An error has occurred.","ExceptionMessage":"Multiple actions were found that match the request: \r\nPostFilter on type imaserver.Controllers.OrdersController\r\nPostOrder on type imaserver.Controllers.OrdersController", "ExceptionType":"System.InvalidOperationException", "StackTrace":" at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"}
这是我的代码:
RouteConfig
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); routes.MapRoute( "CDN", "cdn/{directory}/{file}", new { controller = "CDN", action = "Download", directory = UrlParameter.Optional, file = UrlParameter.Optional } ); routes.MapRoute( name: "API", url: "api/{controller}/{action}", defaults: new { controller = "Home", action = "Index" } ); routes.MapRoute( name: "Default", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index" } ); } }
OrderController
public class OrdersController : ApiController { private FoodDeliveryEntities db = new FoodDeliveryEntities(); // GET: api/Orders public IQueryable<Order> GetOrders() { db.Configuration.ProxyCreationEnabled = false; return db.Orders; } // GET: api/Orders/5 [ResponseType(typeof(Order))] public IHttpActionResult GetOrder(long id) { db.Configuration.ProxyCreationEnabled = false; Order order = db.Orders.Find(id); if (order == null) { return NotFound(); } return Ok(order); } // PUT: api/Orders/5 [ResponseType(typeof(void))] public IHttpActionResult PutOrder(long id, Order order) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != order.Id) { return BadRequest(); } db.Entry(order).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!OrderExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); } // POST: api/Orders/filter [HttpPost] public IHttpActionResult PostFilter(OrderFilter orderFilter) { db.Configuration.ProxyCreationEnabled = false; if (orderFilter.OrderType != null) return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer).OrderByDescending(o => o.PickupDate).Where(o => o.OrderType.Equals(orderFilter.OrderType))); else if (orderFilter.Status != null) return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer).OrderByDescending(o => o.PickupDate).Where(o => o.Status.Equals(orderFilter.Status))); else return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer)); } // POST: api/Orders [ResponseType(typeof(Order))] public IHttpActionResult PostOrder(Order order) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Configuration.ProxyCreationEnabled = false; order.Status = "New"; order.CreatedAt = DateTime.Now; order.UpdatedAt = DateTime.Now; db.Orders.Add(order); db.SaveChanges(); foreach (var orderItem in order.OrderItems) { orderItem.OrderId = order.Id; orderItem.CreatedAt = DateTime.Now; orderItem.UpdatedAt = DateTime.Now; orderItem.IsActive = true; } db.SaveChanges(); return CreatedAtRoute("DefaultApi", new { id = order.Id }, order); } // DELETE: api/Orders/5 [ResponseType(typeof(Order))] public IHttpActionResult DeleteOrder(long id) { Order order = db.Orders.Find(id); if (order == null) { return NotFound(); } db.Orders.Remove(order); db.SaveChanges(); return Ok(order); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } private bool OrderExists(long id) { return db.Orders.Count(e => e.Id == id) > 0; } public partial class OrderFilter { public string Status { get; set; } public string OrderType { get; set; } } }
我也试图将PostFilter重命名为Filter,但没有用
我正在触发此URL:
http://somewebsite/api/Orders/filter POST
我在做什么错?
我正在尝试同时支持Web API和普通控制器。我为不同的动作定义了不同的方法,但是看起来有些错误,因为我一次又一次地跟踪错误{“ ...
由于您是从ApiController继承的,因此只能有1个POST,GET,PUT或DELETE操作,要进行更多操作,请通过用方法修饰方法来更新每个操作以分配其唯一的路由