Вот моя проблема, я хочу получить имя пользователя и пароль клиента с запросом 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
.
Похоже, это идеально подходит для маршрутизации атрибутов. blogs.msdn.microsoft.com/webdev/2013/10/17/…
@mason Можете ли вы помочь мне, предложив свой ответ, пожалуйста? Я пробую разные варианты, например советы в вашей ссылке, но у меня все еще есть 404 (Not found)
В предоставленной мною документации четко описано, как настроить маршрутизацию атрибутов.
Нет api/login
Вы можете сделать так:
[ActionName("api/login")]
public HttpResponseMessage Login([FromBody] LoginJson json)
{
return Request.CreateResponse(HttpStatusCode.OK);
}
Не работает. Я хотел бы использовать URL-адреса: /api/Login
, /api/Method1
и /api/Method2
для 3 разных контроллеров
Вы вызываете контроллер только без каких-либо действий, и, поскольку действие по умолчанию не определено, вы получите ошибку 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")]
не работает, и вы забыли последний вариант
@Rodrigue Я добавил, как добавить его в RouteConfig.cs
Вы имеете в виду установить контроллер по умолчанию на Login
? Это плохая идея. Это просто вернет проблему позже с другим классом Controller
. Если у меня 3 разных контроллера; Я просто хочу иметь /api/Login
, /api/Action1
, /api/Action2
в качестве URL-адресов для моих запросов POST
. В любом случае решение не работает
Это не установка контроллера по умолчанию на Login
для всего, только когда вы делаете /Login
. Так что другой контроллер будет работать так же, как и они. И забыл упомянуть, что вам придется поместить это перед другими маршрутами в RouteConfig
, иначе общий маршрут возьмет верх.
Извините, но вашего ответа мне все еще недостаточно, я не могу получить другой код ошибки, кроме 404 (Not found)
. Могу я попросить у вас более полного ответа?
ApiController
взят из веб-API ASP.NET. AJAX от AJAX. Пожалуйста, не удаляйте полезные теги.