Похоже, вы хотите сопоставить api/ListItems/GetToken
с конечной точкой GetToken()
, и аналогично для GetInvoices
. Из URL-адресов, которыми вы поделились, я предполагаю, что ваш контроллер называется ListItems
.
На самом деле есть два способа сделать это sh. Какой бы метод вы ни выбрали, вам не нужно добавлять параметры в маршрут для показанных вами URL.
Удалите маршрут ApiByName
из конфигурации. Затем вы можете украсить каждое действие полным путем (например, [Route("api/ListItems/GetToken")]
), или , украсить контроллер с помощью [RoutePrefix("api/ListItems")]
и украсить действие (я) с помощью Route("MyAction")
. В приведенном ниже примере на контроллере используется RoutePrefix
.
[RoutePrefix("api/ListItems")]
public class ListItemsController : ApiController
{
[Route("GetToken")]
[HttpGet]
public HttpResponseMessage GetToken(string UserId, string Key, string source)
[Route("GetInvoices", Name = "GetInvoices")]
[HttpGet]
public HttpResponseMessage GetInvoices(string Token, string AcctNo, string YearMonth)
Если вы хотите, чтобы URL выглядел как ListItems/GetToken/123/ABC/Postman
, просто добавьте параметры обратно в маршрут [Route("GetToken/{UserId}/{Key}/{Source}")]
, однако, вы разместили URL-адреса не соответствуют этому формату.
Свойство Name
атрибута Route
может работать не так, как вы ожидаете. На самом деле он используется для определения конечной точки внутри API, а не снаружи. Например, RedirectToRoute("GetInvoices")
вернет перенаправление на конечную точку GetInvoices
. Вам решать, нужно ли вам это включить или нет.
Не использовать атрибут [Route]
вообще.
Вместо этого добавьте следующие маршруты в конфигурацию маршрута API (благодаря ответу Дарина Димитрова ):
config.Routes.MapHttpRoute(
name: "ApiById",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"^[0-9]+$" }
);
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Get" }
);
Затем в контроллере используйте атрибут ActionName("MyAction")
:
[HttpGet]
[ActionName("GetToken")]
public HttpResponseMessage GetToken(string UserId, string Key, string source)
[HttpGet]
[ActionName("GetInvoices")]
public HttpResponseMessage GetInvoices(string Token, string AcctNo, string YearMonth)
Я проверил оба эти метода со следующими URL-адресами:
// get list of items
http://localhost:28092/api/ListItems
// get single item
http://localhost:28092/api/ListItems/1
// GetToken
http://localhost:28092/api/ListItems/GetToken?userid=123&key=ABC&source=Postman
// GetInvoices
http://localhost:28092/api/ListItems/GetInvoices?token=ABC&acctno=1234&yearmonth=2019-12
Примечание 1 : я бы порекомендовал не с использованием /
в качестве разделителя даты в URL-адресе, поскольку это может помешать маршрутизации, вместо этого используйте -
или другой разделитель.
Примечание 2 : Параметры должны иметь значение, иначе каркас не сможет найти правильное действие. Если (некоторые из) параметры должны быть необязательными, укажите значения по умолчанию в сигнатуре метода, например, GetToken(string UserId, string Key, string source = "")
(source
здесь необязательно).
Однако, если вы хотите следовать Шаблон RESTful, тогда вы должны действительно структурировать свои конечные точки так, чтобы они соответствовали ресурсам, на которых они действуют. Вероятно, у вас должен быть контроллер Invoice
, где вы можете выполнять Get
, Post
, Put
, Delete
и др. c для Invoice
с. GetToken
похоже, что он принадлежит другому контроллеру, если только он не связан с какими-либо счетами.