@0LLEGator
"Начинающий" программист в средней компании.

Как различить методы GET/POST в классе контроллера?

Изучаю встроенный контроллер логина последнего майкрософтовского MVC в частности и клиент-серверное взаимодействие в общем.
В приведённых ниже примерах нет специального указания, гет или пост метод, но при отладке они чётко себя осознают, кто гет, а кто не гет. Как это делается, исходя из входных параметров?
public class AccountController : ApiController
{
// GET api/Account/UserInfo
        [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
        [Route("UserInfo")]
        public UserInfoViewModel GetUserInfo()
        {
            ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);

            return new UserInfoViewModel
            {
                Email = User.Identity.GetUserName(),
                HasRegistered = externalLogin == null,
                LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
            };
        }

        // POST api/Account/Logout
        [Route("Logout")]
        public IHttpActionResult Logout()
        {
            Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);
            return Ok();
        }
}
  • Вопрос задан
  • 1949 просмотров
Пригласить эксперта
Ответы на вопрос 3
@dmitryKovalskiy
программист средней руки
Можно через параметры объекта Request. Там есть такое поле. Однако это плохая практика. Я бы рекомендовал перегрузить метод каким-нибудь параметром(врятли вы делаете POST без параметров) и проставить атрибуты [httpget][httppost].
А по поводу кода выше - там запросы делаются по разным адресам. Там же не делается POST -запрос на api/Account/ и система сама догадывается до того что надо делать Logout
Ответ написан
@Dzhamal
.NET разработчик
Есть несколько способов определения того, запросы каких типов обрабатывает конкретный метод. Один метод может обрабатывать запросы только одного типа (например только GET, или только POST). Лично я предпочитаю перед методом ставить специальный атрибут типа [HttpGet], что в паре с [Route("custom/url/for/method")] и понятным названием метода дает максимальную понятность кода контроллера. Кроме атрибутов, web api поддерживает еще naming convention метод определения того, запросы какого типа обрабатывает метод. Подробностей я не помню, надо читать доку. Ну а как в Вашем примере контроллер понимает, что логаут принимает только пост запросы - понятия не имею, за этим тоже надо в документацию лезть, там такие тонкие моменты подробно описаны.
Ну и вообще, не в обиду сказано, ответы на вопросы такого плана лучше сразу искать в документации.
Ответ написан
@HeBonpoc
Новый webapi смотрит и на названия методов. По дефолту get не разрешен, поэтому для 2го экшена остаётся пост.
www.asp.net/web-api/overview/web-api-routing-and-a...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы