Простой POST с ASP.NET Framework

Вот моя проблема, я хочу получить имя пользователя и пароль клиента с запросом POST.

Код кажется простым, но не работает

LoginController.cs:

public class LoginController : ApiController
{
    [HttpPost]
    [ActionName("Login")]
    [Route("api/{controller}")]
    public HttpResponseMessage Login([FromBody] LoginJson json)
    {
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

Форма LoginJson.cs:

public class LoginJson
{
    public string Username { get; set; }
    public string Password { get; set; }
}

Запрос ajax с jQuery, я не хочу изменять URL-адрес, потому что я хочу использовать 3 URL-адреса /api/Login, /api/Method1 и /api/Method2 для 3 разных контроллеров:

$.ajax({
        url: '/api/Login',
        type: 'POST',
        dataType: "json",
        contentType: "application/json, charset=utf-8",
        data: JSON.stringify({
            Username: username,
            Password: password,
        }),
        ...
});

Маршрут для API в Global.asax.cs:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalFilters.Filters.Add(new HandleErrorAttribute());
    RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    RouteTable.Routes.MapRoute(...)


    GlobalConfiguration.Configuration.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}",
        defaults: new {action = RouteParameter.Optional}
    );
}

Я получаю ошибку 404 (Not Found). Поменяю файл Global.asax.cs.

ApiController взят из веб-API ASP.NET. AJAX от AJAX. Пожалуйста, не удаляйте полезные теги.
Camilo Terevinto 26.10.2018 17:11

Похоже, это идеально подходит для маршрутизации атрибутов. blogs.msdn.microsoft.com/webdev/2013/10/17/…

mason 26.10.2018 17:50

@mason Можете ли вы помочь мне, предложив свой ответ, пожалуйста? Я пробую разные варианты, например советы в вашей ссылке, но у меня все еще есть 404 (Not found)

Rod 26.10.2018 18:01

В предоставленной мною документации четко описано, как настроить маршрутизацию атрибутов.

mason 26.10.2018 18:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
2 336
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет api/login

Вы можете сделать так:

[ActionName("api/login")]
public HttpResponseMessage Login([FromBody] LoginJson json)
{
    return Request.CreateResponse(HttpStatusCode.OK);
}

Не работает. Я хотел бы использовать URL-адреса: /api/Login, /api/Method1 и /api/Method2 для 3 разных контроллеров

Rod 26.10.2018 17:43
Ответ принят как подходящий

Вы вызываете контроллер только без каких-либо действий, и, поскольку действие по умолчанию не определено, вы получите ошибку 404.

В jQuery вы можете:

url: '/api/Login/Login'

Или измените маршрутизацию, поместив этот тег:

[Route("api/login")]

Или в RouteConfig.cs это должно быть сделано до того, как будут установлены другие маршруты, включая общий.

routes.MapRoute("Login", "Login/{action}",
        defaults: new { controller = "Login", action = "Login" });

Я не хочу менять URL-адрес из jQuery, [ActionName("api/login")] не работает, и вы забыли последний вариант

Rod 26.10.2018 17:10

@Rodrigue Я добавил, как добавить его в RouteConfig.cs

Tom Dee 26.10.2018 17:20

Вы имеете в виду установить контроллер по умолчанию на Login? Это плохая идея. Это просто вернет проблему позже с другим классом Controller. Если у меня 3 разных контроллера; Я просто хочу иметь /api/Login, /api/Action1, /api/Action2 в качестве URL-адресов для моих запросов POST. В любом случае решение не работает

Rod 26.10.2018 17:21

Это не установка контроллера по умолчанию на Login для всего, только когда вы делаете /Login. Так что другой контроллер будет работать так же, как и они. И забыл упомянуть, что вам придется поместить это перед другими маршрутами в RouteConfig, иначе общий маршрут возьмет верх.

Tom Dee 26.10.2018 17:31

Извините, но вашего ответа мне все еще недостаточно, я не могу получить другой код ошибки, кроме 404 (Not found). Могу я попросить у вас более полного ответа?

Rod 26.10.2018 18:04

Другие вопросы по теме