数据库有效.它实际上插入了新记录,但是当我使用CreatedAtRoute()时,我总是从客户端获得500回.为什么?
我的控制器获取:
[Route("api/[controller]")]
public class IngredientController : Controller
{
private SimpleCookbookDbContext db { get; set; }
public IngredientController(SimpleCookbookDbContext context)
{
db = context;
}
// GET: api/values
[HttpGet]
public async Task> Get()
{
return await db.Ingredients.ToListAsync();
}
// GET api/values/5
[HttpGet("{id}", Name = "GetIngredient")]
public async Task Get(int id)
{
return await db.Ingredients.SingleOrDefaultAsync(i => i.Id == id);
}
[HttpPost]
public async Task Post([FromBody]Ingredient ingredient)
{
try
{
var res = await IM.CreateAsync(ingredient);
if (!res.Success)
{
return HttpBadRequest(res.Errors);
}
}
catch(Exception)
{
return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
}
return CreatedAtRoute("GetIngredient", new { controller="Ingredient", id = ingredient.Id });
}
}
我试过调试一下.是的,如果我试图插入的成分已经存在,它将返回HttpBadRequest.
我尝试在catch块中放置一个断点,我没有到达那里,所以我假设数据库没有错误.
记录确实插入到数据库中.我确实上线,return CreatedAtRoute(...);
但我得到500回.(我也在那里设置断点).
现在,我正在使用提琴手.我的要求是这样的:
POST /api/ingredient HTTP/1.1 Host: localhost:55303 Content-Type: application/json;charset=utf-8 {"id":0, "name": "rosemary", "description": "rosemary"}
我还删除了属性名称上的双引号,我仍然得到相同的500.
我确实在初创公司解决了骆驼套管:
services.AddMvc().AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
我想我展示了所有相关代码.如果您需要更多,请告诉我.
UPDATE
CreatedAtRoute有一个带有三个参数的重载:
return CreatedAtRoute("GetIngredient", new { controller="Ingredient", id = ingredient.Id }, ingredient);
最后一个参数是一个对象,您可以动态创建或传回整个实体,具体取决于您要公开的内容.
奇怪的是,如何使用2参数变体会产生奇怪的500响应.