Я перехожу с веб-API WCF на новый веб-API ASP.NET MVC 4. У меня есть UsersController, и я хочу иметь метод с именем Authenticate. Я вижу примеры того, как выполнять GetAll, GetOne, Post и Delete, но что, если я хочу добавить дополнительные методы в эти службы? Например, моя служба UsersService должна иметь метод под названием Authenticate, в который они передают имя пользователя и пароль, однако он не работает.
public class UsersController : BaseApiController
{
public string GetAll()
{
return "getall!";
}
public string Get(int id)
{
return "get 1! " + id;
}
public User GetAuthenticate(string userName, string password, string applicationName)
{
LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
userName, password, applicationName));
//check if valid leapfrog login.
var decodedUsername = userName.Replace("%40", "@");
var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);
if (leapFrogUsers.Count > 0)
{
return new User
{
Id = (uint)leapFrogUsers[0].Id,
Guid = leapFrogUsers[0].Guid
};
}
else
throw new HttpResponseException("Invalid login credentials");
}
}
Я могу перейти к myapi / api / users /, и он вызовет GetAll, а я могу перейти к myapi / api / users / 1, и он вызовет Get, однако, если я вызову myapi / api / users / authenticate? Username = {0} & password = {1}, тогда он вызовет Get (НЕ аутентифицирует) и выдаст ошибку:
Словарь параметров содержит пустую запись для параметра id типа System.Int32, не допускающего значения NULL, для метода System.String Get (Int32) в Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController. Необязательный параметр должен быть ссылочным типом, типом, допускающим значение NULL, или быть объявленным как необязательный параметр.
Как я могу вызвать пользовательские имена методов, такие как Authenticate?
Ответы:
По умолчанию конфигурация маршрута следует соглашениям RESTFul, что означает, что он будет принимать только имена действий Get, Post, Put и Delete (посмотрите на маршрут в global.asax => по умолчанию он не позволяет вам указать любое имя действия => он использует HTTP-глагол для отправки). Итак, когда вы отправляете запрос GET,
/api/users/authenticate
вы в основном вызываетеGet(int id)
действие и передаете,id=authenticate
что, очевидно, приводит к сбою, потому что ваше действие Get ожидает целое число.Если вы хотите, чтобы имена действий отличались от стандартных, вы можете изменить определение маршрута в
global.asax
:Теперь вы можете перейти к
/api/values/getauthenticate
для аутентификации пользователя.источник
{action}
ограничения,{id}
чтобы ничего, кромеint
илиGuid
(или чего-то еще), не совпадало. Тогда он сможет пройти до предложенного ДариномЭто лучший метод, который я придумал до сих пор, чтобы включить дополнительные методы GET, одновременно поддерживая обычные методы REST. Добавьте следующие маршруты в свой WebApiConfig:
Я проверил это решение с помощью тестового класса ниже. Мне удалось успешно применить каждый метод в моем контроллере ниже:
Я подтвердил, что он поддерживает следующие запросы:
Обратите внимание: если ваши дополнительные действия GET не начинаются с Get, вы можете добавить к методу атрибут HttpGet.
источник
put
иdelete
глаголы , такие , как вы делали наget
иpost
будет работать тоже хорошо?put
илиdelete
глаголы, поскольку эти запросы обычно сопровождают параметр id для идентификации ресурса, к которому вы хотите применить эту операцию.delete
Вызов/api/foo
должен выдавать ошибку , потому который Foo вы пытаетесь удалить? Поэтому маршрут DefaultApiWithId должен нормально обрабатывать эти случаи.Я уже несколько дней в мире MVC4.
Как бы то ни было, у меня есть SitesAPIController, и мне нужен был специальный метод, который можно было бы назвать так:
С разными значениями последнего параметра для получения записи с разными диспозициями.
Что в итоге сработало для меня:
Метод в SitesAPIController:
И это в файле WebApiConfig.cs
Пока я называл {disposition} как {id}, я встречал:
Когда я переименовал его в {disposition}, он заработал. Таким образом, очевидно, что имя параметра совпадает со значением в заполнителе.
Не стесняйтесь редактировать этот ответ, чтобы сделать его более точным / пояснительным.
источник
Web Api по умолчанию ожидает URL в форме api / {controller} / {id}, чтобы переопределить эту маршрутизацию по умолчанию. вы можете настроить маршрутизацию одним из двух способов.
Первый вариант:
Добавьте ниже регистрацию маршрута в WebApiConfig.cs
Украсьте свой метод действия HttpGet и параметрами, как показано ниже.
для вызова вышеуказанного метода URL-адрес будет таким, как показано ниже
http: // localhost: [ваш порт] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
Второй вариант Добавьте префикс маршрута к классу контроллера и украсьте свой метод действия с помощью HttpGet, как показано ниже. В этом случае не нужно изменять WebApiConfig.cs. Может иметь маршрутизацию по умолчанию.
для вызова вышеуказанного метода URL-адрес будет таким, как показано ниже
http: // localhost: [ваш порт] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
источник
Если вы используете ASP.NET 5 с ASP.NET MVC 6 , большинство из этих ответов просто не будут работать, потому что вы обычно позволяете MVC создавать для вас соответствующую коллекцию маршрутов (с использованием соглашений RESTful по умолчанию), что означает, что вы не найдете
Routes.MapRoute()
призывов к редактированию по желанию.ConfigureServices()
Метод вызываетсяStartup.cs
файл зарегистрирует MVC с рамками внедрения зависимостей , встроенной в ASP.NET 5: Таким образом, когда вы звонитеApplicationBuilder.UseMvc()
позже в этом классе, структура MVC автоматически добавит эти маршруты по умолчанию для вашего приложения. Мы можем взглянуть на то, что происходит за кулисами, посмотрев наUseMvc()
реализацию метода в исходном коде фреймворка:Хорошо то, что фреймворк теперь выполняет всю тяжелую работу, перебирая все действия контроллера и настраивая их маршруты по умолчанию, тем самым избавляя вас от лишней работы.
Плохо то, что документации о том, как можно добавлять собственные маршруты, мало или совсем нет. К счастью, вы можете легко сделать это, используя подход на основе соглашений и / или на основе атрибутов (также известный как маршрутизация атрибутов ).
На основе конвенций
В своем классе Startup.cs замените это:
с этим:
На основе атрибутов
В MVC6 замечательно то, что вы также можете определять маршруты для каждого контроллера, украсив
Controller
класс и / илиAction
методы соответствующими параметрамиRouteAttribute
и / илиHttpGet
/HttpPost
шаблоном, например следующими:Этот контроллер будет обрабатывать следующие запросы:
Также обратите внимание, что если вы используете два подхода вместе, маршруты на основе атрибутов (если они определены) будут переопределять маршруты на основе соглашений, и оба из них будут переопределять маршруты по умолчанию, определенные с помощью
UseMvc()
.Для получения дополнительной информации вы также можете прочитать следующий пост в моем блоге.
источник
public IActionResult Patch(int id, [FromQuery] Person person)
, все входящие свойства равно нуль!См. Эту статью для более подробного обсуждения именованных действий. Он также показывает, что вы можете использовать атрибут [HttpGet] вместо префикса имени действия с помощью «get».
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
источник
Просто измените свой WebAPIConfig.cs, как показано ниже
Затем реализуйте свой API, как показано ниже
источник
Web APi 2 и более поздние версии поддерживают новый тип маршрутизации, называемый маршрутизацией по атрибутам. Как следует из названия, атрибутная маршрутизация использует атрибуты для определения маршрутов. Маршрутизация атрибутов дает вам больше контроля над URI в вашем веб-API. Например, вы можете легко создавать URI, описывающие иерархии ресурсов.
Например:
Будет идеально, и вам не понадобится дополнительный код, например, в WebApiConfig.cs. Просто убедитесь, что маршрутизация веб-API включена или не включена в WebApiConfig.cs, если нет, вы можете активировать, как показано ниже:
Вам не нужно ничего делать или что-то менять в WebApiConfig.cs. Более подробно вы можете прочитать в этой статье .
источник