Настройка роутинга web api

247
12 октября 2018, 07:40

Не получается настроить роутинг для проекта 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)
        {
        }
    }
}
Answer 1

Возможно дело в том, что происходит не совсем ожидаемое сопоставление. К примеру, вы переходите по маршруту:

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

READ ALSO
Подсветка в ScintillaNET

Подсветка в ScintillaNET

До этого пользовался более старой версиейУ меня есть код для включения подсветки в редакторе, но он не работает:

222
Замена символов в textbox

Замена символов в textbox

работаю на WPFИ появилась идея сделать нечто вроде программы шифрования

215
Не могу открыть AssetBudnle на iPhone

Не могу открыть AssetBudnle на iPhone

Приложение, по клику на кнопку с названием проекта, должна перейти на другую сценуПосле переход должна произвестись распаковка AssetBundle'а

219
c# CefSharp много жрет памяти

c# CefSharp много жрет памяти

На c# пишу бота, который самостоятельно заходит на сайты для серфинга, использую библиотеку CefSharpОткрываю 14 страниц, а жрет больше, чем оригинальный...

189