Подтвердить что ты не робот

Ресурс HTTP не найден, что соответствует URI запроса в Web API

Я настроил свой WebApiConfig следующим образом:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

У меня есть один метод, который принимает один параметр. Доступный URI составляет http://localhost:8598/api/WebApi/GetLocationCategory/87.

Это дает мне ошибку: No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'

Контроллер:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int CatID)
{
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == CatID select new { lc.LocationID, lc.LocationName }).ToList();
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();

    foreach (var element in LocCats)
    {
        loc.Add(new LocationCategory_CLS
        {
            LocationID = element.LocationID,
            LocationName = element.LocationName
        });
    }
    return loc;
}
4b9b3361

Ответ 1

Попробуйте изменить свой метод контроллера как

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id) <-- Change
{
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == id select new { lc.LocationID, lc.LocationName }).ToList();
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();

    foreach (var element in LocCats)
    {
        loc.Add(new LocationCategory_CLS
        {
            LocationID = element.LocationID,
            LocationName = element.LocationName
        });
    }
    return loc;
}

Изменение только, изменение входного параметра от CatId до id.... Оно работает для меня много раз.

Изменить:


Его долгое время, когда я оглядываюсь назад Я думаю. Теперь я знаю причину. Words Like Jared верен, все это связано с маршрутизацией, которую мы укажем. Если у меня есть маршрут (по умолчанию):

routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

И мой URL /MyController/GetLocationCategory/123, он будет эквивалентен /MyController/GetLocationCategory?id=123.

Аналогично, если я хочу изменить имя параметра для Id, чтобы сказать CatId, тогда мне нужно изменить параметр строки запроса (способ, которым я вызываю действие Controller Action, будет меняться). Что теперь будет:

/MyController/GetLocationCategory?CatId=123

Ответ 2

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Карты в:

http://localhost:8598/api/Controller/Action/id

Часть WebApi URL-адреса избыточна с api. Затем измените имя параметра метода в соответствии с маршрутом:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

Это хорошее значение по умолчанию, поскольку оно соответствует соглашению.

В качестве альтернативы вы можете изменить маршрут для использования этого имени нетрадиционного параметра:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{CatID}",
            defaults: new { CatID = RouteParameter.Optional }
        );

Наконец, в любом случае убедитесь, что имя контроллера заканчивается на Controller.

Хорошие имена: CustomController, CustomApiController
Плохие имена: Custom, CustomApi

Ответ 3

Каково имя вашего контроллера и действия?

URL должен быть

http://localhost:8598/api/Controller/Action

Он не сопоставляется с указанной вами конфигурацией маршрута, поэтому конвейер не может найти правильный контроллер. /Id не должен находиться в пути, который должен находиться в теле или параметрах запроса (я был в тупике!)

Пример: -

public class FooController : ApiController
    {
        public int GetIndex(int id)
        {
            return id;
        }
    }

localhost:58432/api/foo/GetIndex?Id=1

O/P :- 1

Примечание. - Если ваше имя действия GetIndex, то URL-адрес должен быть GetIndex не только индексом. При желании вы можете указать атрибут [HttpGet] для действия.

Если в вашем WebApi.config есть и следующее:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

Тогда http://localhost:58432/api/foo?Id=1 также будет законным путем. Не уверен, хотите ли вы этого.

Кроме того, если WebAPI, насколько это возможно, придерживается маршрутизации без действия, для этого предназначен MVC. Это не рекомендуется.

Ответ 4

Ваш URL-адрес запроса http://localhost:8598/api/WebApi/GetLocationCategory/87

Ваш маршрут настроен на прием: 'api/{controller}/{action}/{id}'

Итак, вам нужно убедиться, что имя вашего контроллера - "WebApiController".

Кроме того, как указано alredy от @SDG, вам нужно убедиться, что имя параметра для вашего метода действий соответствует тому, что у вас есть в вашем шаблоне маршрута. i.e измените "CatID" на "id"