Я только начал работать с ApiController. Я пытаюсь выполнить HTTP GET, отправив идентификатор, но он не работает.
Мой ApiController:
[Route("api/Test")]
public class TestController : ApiController
{
private myEntity db = new myEntity();
[HttpGet]
public HttpResponseMessage GetAll()
{
// Get a list of customers
IEnumerable<Customer> customers = db.Customers.ToList();
// Write the list of customers to the response body
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, customers);
return response;
}
[HttpGet]
public HttpResponseMessage GetById(int id)
{
// Get Customer by id
Customer customer = db.Customers.Where(x => x.Id == id).FirstOrDefault();
HttpResponseMessage response;
if (customer == null)
{
response = Request.CreateResponse(HttpStatusCode.NotFound);
return response;
} else
{
response = Request.CreateResponse(HttpStatusCode.OK, customer);
}
return response;
}
Когда я запускаю его в браузере, метод GetAll работает отлично. Однако когда я пробую GetById:
http://localhost:53198/api/Test/1
Он возвращает:
No HTTP resource was found that matches the request URI
http://localhost:53198/api/Test/1
Кто-нибудь знает, что я делаю не так?





Вы можете сделать либо
http://localhost:53198/api/Test/GetById/1 (как упоминал DavidG)или же
http: // локальный: 53198 / api / Test / 1 и измените свой код на
[HttpGet]
[Route("{id:int}")]
public HttpResponseMessage GetById(int id)
Добавление [Route ("{id: int}")] не помогло мне. Та же ошибка
@MaxBoy Можете ли вы обновить свой вопрос содержимым класса WebApiConfig
Добавление RoutePrefix работает. Однако, если я отправляю идентификатор, которого нет в базе данных, он просто дает мне пустую страницу в браузерах, а не статус NotFound.
@MaxBoy Вы должны вернуть 404, если вы не нашли запись с этим идентификатором в своей базе данных, она не делает это автоматически для вас
Хм ... Я пытался сделать это с помощью response = Request.CreateResponse (HttpStatusCode.NotFound); Это неправильно?
@MaxBoy return Request.CreateResponse(System.Net.HttpStatusCode.NotFound)
Если вы используете маршрутизацию атрибутов, вам нужно будет внести несколько изменений, чтобы убедиться, что маршруты действий различны, чтобы избежать конфликтов маршрутов.
[RoutePrefix("api/Test")]
public class TestController : ApiController {
private myEntity db = new myEntity();
//GET api/Test
[HttpGet]
[Route("")]
public IHttpActionResult GetAll() {
// Get a list of customers
var customers = db.Customers.ToList();
// Write the list of customers to the response body
return OK(customers);
}
//GET api/Test/1
[HttpGet]
[Route("{id:int}")]
public IHttpActionResult GetById(int id) {
// Get Customer by id
Customer customer = db.Customers.Where(x => x.Id == id).FirstOrDefault();
if (customer == null) {
return NotFound();
}
return Ok(customer);
}
}
Предполагается, что маршрутизация атрибутов включена.
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Ссылка Маршрутизация атрибутов в веб-API ASP.NET 2
RoutePrefix работает. Однако, если я отправляю идентификатор, которого нет в базе данных, он просто дает мне пустую страницу в браузерах, а не статус NotFound.
Вам придется отредактировать функцию, чтобы она не возвращалась. Прямо сейчас на телефоне. Обновится, когда я вернусь к своей машине.
Спасибо ... Жду. Idk, что такое "редактор функции"
@MaxBoy проверяет обновления, используя рекомендованный синтаксис из документации.
Спасибо ... Я заменил свой код на использование NotFound (); но это ничего не изменило. Когда я делаю запрос на получение с идентификатором, которого не существует, он просто возвращает пустую страницу. Я имею в виду, он не возвращает ошибку / предупреждение NotFound
Ваш URL неверен:
http://localhost:53198/api/Test/GetById/1