Ресурс 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;
}
Ответы
Ответ 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"