Как исправить ошибку http 500 относительно маршрутизации?

Я использую asp.net web api 2, и запрос не может найти и запустить методы IHttpActionResult. Я считаю, что это проблема с моей маршрутизацией. Ответ об ошибке (http 500), который я получаю: «произошла ошибка при попытке создать контроллер типа Убедитесь, что контроллер имеет открытый конструктор без параметров».

Я отправляю запрос: Глагол: GET localhost:xxxx/api/simpleproduct/getproduct?id=3

[RoutePrefix("api/simpleproduct")]
    public class SimpleProductController : ApiController
    {
        List<Product> products = new List<Product>() { new Product { Id = 1, Name = "Demo1", Price = 1 }, new Product { Id = 2, Name = "Demo2", Price = 2 }, new Product { Id = 3, Name = "Demo3", Price = 3 } };

        public SimpleProductController(List<Product> products)
        {
            this.products = products;
        }

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }
        [Route("getproduct")]
        [HttpGet]
        public IHttpActionResult GetProduct(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }

        public IHttpActionResult AddProduct(int Id, string Name, decimal Price)
        {
            if (Id == 0 || Name == null || Price == 0)
            {
                return Conflict();
            }

            products.Add(new Product { Id = Id, Name = Name, Price = Price });

            return Ok(products);
        }

        public IHttpActionResult DeleteProduct(int Id)
        {
            if (Id < 0)
            {
                return Conflict();
            }

            var products2 = products.ToList();
            foreach (var product2 in products2)
            {
                if (product2.Id == Id)
                {
                    products.Remove(product2);
                }
            }

            return Ok(products);
        }
    }

person user3126215    schedule 26.02.2014    source источник
comment
Вы пытались добавить конструктор без параметров?   -  person PmanAce    schedule 26.02.2014
comment
Также я не уверен, почему вы должны передавать продукты через контроллер, вы должны передавать только зависимости.   -  person PmanAce    schedule 26.02.2014
comment
Я пробовал это, но это не сработало. Вы имеете в виду addproduct?   -  person user3126215    schedule 26.02.2014


Ответы (1)


Как уже упоминалось в комментариях @PmanAce, вам нужен открытый конструктор без параметров.

public SimpleProductController()
{
}

Я предполагаю, что вы просто тестируете/пробуете веб-API, поэтому вы жестко кодируете свои продукты как приватную переменную. В этом случае вам вообще не нужно, чтобы конструктор принимал параметр products.

Если у вас работает пример, вы можете попробовать внедрить репозиторий в свой контроллер. Он отделяет логику, извлекающую данные (которые сопоставляются с вашей сущностью), от контроллера. Вот хорошая статья о внедрении зависимостей для контроллеров веб-API, в которой используется репозиторий и Unity для внедрения в качестве зависимости. Как ни странно, он использует ту же структуру продукта, что и вы.

http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver

person Rei Mavronicolas    schedule 26.02.2014