ASP.net 5 Web API Post CreatedAtRoute始终返回500内部服务器错误

时间:2015-12-10 17:43:36

标签: asp.net-web-api asp.net-core-mvc

数据库有效。它实际上插入了新记录,但是当我使用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响应。

0 个答案:

没有答案