Не получается настроить роутинг для проекта web api всё делаю согласно инфо: https://stackoverflow.com/questions/9569270/custom-method-names-in-asp-net-web-api Мне нужно, чтобы в контроллере Consultants кроме стандартных методов Get, Post, Put, Delete я реализовал бы другие, Например GetAll, GetByCategory(int categoryId)
И запросы были бы:
http://localhost:54788/api/consultants - Get
http://localhost:54788/api/consultants/1 - Get(int id)
.
.
.
http://localhost:54788/api/consultants/GetAll - GetAll
http://localhost:54788/api/consultants/GetByCategory/1 - GetByCategoryId(int id)
По идее моим требованиям соответствую настройки:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute("ApiWithAction", "api/{controller}/{action}");
config.Routes.MapHttpRoute("ApiWithActionAndParameter", "api/{controller}/{action}/{id}");
Работает только запрос http://localhost:54788/api/consultants/1 - остальные нет
Ощущение, что не применяются эти настройки
Кроме того попробовал модифицировать дефолтную конфигурацию:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
);
По идее это так же сдолжно сработать, возможно использовать имя метода в запросе - если я правильно понял их логику - так же не работает корректно
Прходится указывать методы по умолчанию - а это не соответствут архитектуре REST
http://localhost:54788/api/consultants/get - Get
http://localhost:54788/api/consultants/get/1 - Get(int id)
.
.
.
http://localhost:54788/api/consultants/GetAll - GetAll
http://localhost:54788/api/consultants/GetByCategory/1 - GetByCategoryId(int id)
Прошу помочь
UPD: код контроллера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Mvc;
using WebApplication1.BLL;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class ConsultantsController : ApiController
{
ConsultantManager consMng = new ConsultantManager();
ServiceManager serviceMng = new ServiceManager();
private DB db = new DB();
/// <summary>
/// Получить консультанта для карточки (слайд 12)
/// </summary>
public Object Get()
{
return Ok(new { result = "get" });
}
public Object Get(int id)
{
PrivateConsultant cons = consMng.GetById(id);
PrivateConsultantVM result = new PrivateConsultantVM
{
Name = cons.Name,
Surname = cons.Surname,
Patronymic = cons.Patronymic,
Rating = cons.Rating,
ServicesTitles = serviceMng.GetTitles(cons.Id)
};
return Ok(new { result, date = DateTime.Now });
}
public Object GetAll()
{
return Ok(new { result = "getall" });
}
public Object GetByCategory()
{
return Ok(new { result = "GetByCategory" });
}
// GET api/values/5
//public string Get(int id)
//{
// return "value";
//}
// POST api/values
//public void Post(/*[FromBody]*/string value)
//{
//}
public void Post()
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
}
Возможно дело в том, что происходит не совсем ожидаемое сопоставление. К примеру, вы переходите по маршруту:
localhost:54788/api/consultants/GetAll
И он сопоставляется с шаблоном:
Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
где GetAll
подставляется на место id
, т.к. шаблоны перебираются по порядку, а DefaultApi
определен первым в списке. Эту конкретную проблему можно было бы решить, задав ограничение параметров:
Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = new IntRouteConstraint() });
Подробнее можно почитать тут: https://metanit.com/sharp/aspnet_webapi/3.2.php
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
До этого пользовался более старой версиейУ меня есть код для включения подсветки в редакторе, но он не работает:
работаю на WPFИ появилась идея сделать нечто вроде программы шифрования
Приложение, по клику на кнопку с названием проекта, должна перейти на другую сценуПосле переход должна произвестись распаковка AssetBundle'а
На c# пишу бота, который самостоятельно заходит на сайты для серфинга, использую библиотеку CefSharpОткрываю 14 страниц, а жрет больше, чем оригинальный...