xXxRevolutionxXx Ответов: 3

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]

3 Ответов

Рейтинг:
2

Graeme_Grant

404 - это "страница не найдена". Вы ищете маршрут, которого не существует. Как упоминает "J snooze", в рамках отладки маршрутов попробуйте сделать это вручную. Кроме того, используйте инструменты отладки веб-браузера и проверьте фактический необработанный разговор, чтобы увидеть, действительно ли вызываемые URL-адреса соответствуют ожиданиям вашей таблицы маршрутов.

Кроме того, вот полный список код состояния http[^]


Рейтинг:
1

Bryian Tan

Вы проверили настройку запросов перекрестного происхождения (CORS)? Я предполагаю, что это ошибка, которую приложение выдает при вызове API через jQuery AJAX request.

HTTP404: не найден-сервер не нашел ничего, что соответствовало бы запрошенному URI (Uniform Resource Identifier). ОПЦИИ XHR

Посмотрите эту статью, там есть раздел, объясняющий настройку CORS, и вы можете скачать код и немного поэкспериментировать с ним.
ASP.NET подсказка MVC с помощью веб-API, загрузочный пирог и диалоговое окно на jQuery пользовательского интерфейса [^]


Рейтинг:
0

koklimabc

$.ajax({
                        url: "/api/cart",
                        type : "Post",
                        data: $(this).next().val()
});
 
window.location.href = "~/Login/Account";
 
Backend code
private ApplicationDbContext _context = new ApplicationDbContext();
 
private IEnumerable<IndividualTable> GetContext
{
    get {return _context.IndividualTable ;}
}