404 ошибка при отправке запроса на контроллер web api
Я создаю ASP.NET веб-сайт MVC и, как следует из названия, я пытаюсь отправить POST-запрос на контроллер Web Api с помощью jquery, но всегда получаю ошибку 404. Самое безумное, что в этом .NET framework 4.5 точно так же работал, но в своем .NET framework 4.6.2 на самом деле это не так. Я нашел много тем в google, объясняющих, что может пойти не так, но ни одна из них не сработала. Итак, вот мой код сейчас:
Класс Web Api:
[Authorize] public class CartController : ApiController { private ApplicationDbContext _context; public CartController() { _context = new ApplicationDbContext(); } [HttpPost] public IHttpActionResult AddToCart(string productId) { if (!ModelState.IsValid || !ItemIsValid(productId)) return BadRequest(); var newCartItem = new ShoppingCartItem { ProductId = productId, UserId = User.Identity.GetUserId() }; _context.ShoppingCartItems.Add(newCartItem); _context.SaveChanges(); return Ok(); } private bool ItemIsValid(string productId) { return Enumerable.Any(_context.Products, contextproduct => contextproduct.Id.ToString() == productId && contextproduct.NumberAvailable > 0); } }
Мой код jQuery:
$(".buy-button").click(function() { if (@User.Identity.IsAuthenticated.ToString().ToLower() === true) { $.ajax({ url: "/api/cart", method: "POST", data: $(this).next().val() }).done(function() { alert("Product succesfully added to cart!"); }); } else { window.location.href = "@Url.Action("Login", "Account")"; } });
Глобальный.код эйсакс :
AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles);
Было бы здорово, если бы кто-нибудь мог мне помочь. Я потратил более 6 часов на эту ошибку и до сих пор не могу понять, что я делаю не так.
Что я уже пробовал:
1) некоторые потоки сказали, что порядок "вызовов" в Global. asax имеет значение, поэтому я изменил позицию '
RouteConfig.RegisterRoutes(RouteTable.Routes);'
во всех возможных местах.
2) добавлены атрибуты маршрута в моем действии Web Api([Route("api/Cart/AddToCart")]), которые, как я знаю по опыту, являются избыточными ... и соответственно изменил свой код jQuery.
3) вместо того, чтобы добавить атрибуты, я добавил маршруты непосредственно в веб-API конфигурации.
4) я также попытался вызвать Api с помощью postman напрямую(конечно, я удалил атрибут Authorize).
Ничего из этого не сработало.
j snooze
работает ли это, если вы отключите авторизацию и просто наберете url api в выбранном вами браузере с помощью productid? Что делать, если вы разделите его полностью до простого get, комментируя все остальные вещи, включая проверки авторизации. Недавно я имел удовольствие играть с ними .NET core webapi + angular2 в первый раз, только чтобы понять, что маршрут по умолчанию в проекте не имел действия как его часть, он предполагал только api/[controller]