我使用的是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);
}
}
答案 0 :(得分:0)
与评论中已经提到的@PmanAce一样,您需要一个无参数的公共构造函数。
public SimpleProductController()
{
}
我假设您只是在测试/尝试使用Web API,这就是为什么您将产品硬编码为私有变量的原因。在这种情况下,您根本不需要构造函数来获取products参数。
如果您的示例正在运行,您可能希望尝试将存储库注入控制器。它将从控制器检索数据(映射到您的实体)的逻辑分开。这是一篇关于Web API控制器的依赖注入的好文章,它利用存储库和Unity将其作为依赖项注入。奇怪的是,它使用了您正在使用的相同产品结构。
http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver