数据库有效。它实际上插入了新记录,但是当我使用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<IEnumerable<Ingredient>> Get()
{
return await db.Ingredients.ToListAsync();
}
// GET api/values/5
[HttpGet("{id}", Name = "GetIngredient")]
public async Task<Ingredient> Get(int id)
{
return await db.Ingredients.SingleOrDefaultAsync(i => i.Id == id);
}
[HttpPost]
public async Task<IActionResult> 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回。 (我也在那里设置断点)。
现在,我正在使用fiddler。我的要求是:
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();
});
我想我展示了所有相关代码。如果您需要更多,请告诉我。
更新
CreatedAtRoute有一个带有三个参数的重载:
return CreatedAtRoute("GetIngredient", new { controller="Ingredient", id = ingredient.Id }, ingredient);
最后一个参数是一个对象,您可以动态创建或传回整个实体,具体取决于您要公开的内容。
奇怪的是,如何使用2参数变体会导致奇怪的500响应。