我遇到一个非常奇怪的错误。
我有一个Item,其中包含一些JsonRequired属性。
当我缺少所需的一个属性时尝试致电我的路线以获取我的物品时,我的错误不会自动引发为错误代码500,而我会得到200 OK。
这是我的路线:
[HttpGet("{itemId}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<Item>> GetItemByIdAsync(long installationId, Guid itemId)
{
return await _itemService.GetItemByIdAsync(installationId, itemId);
}
这是我的Item类:
public class Item
{
[JsonProperty("id")]
[JsonRequired]
public Guid Id { get; set; }
[JsonProperty("name")]
[JsonRequired]
public string Name { get; set; }
}
这是我的中间件:
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (NotFoundException ex)
{
await HandleExceptionAsync(context, HttpStatusCode.NotFound, ex);
}
catch (UnauthorizedException ex)
{
await HandleExceptionAsync(context, HttpStatusCode.Unauthorized, ex, false);
}
catch (ConflictException ex)
{
await HandleExceptionAsync(context, HttpStatusCode.Conflict, ex);
}
catch (BadRequestException ex)
{
await HandleExceptionAsync(context, HttpStatusCode.BadRequest, ex);
}
}
private Task HandleExceptionAsync(HttpContext context, HttpStatusCode httpCode, Exception exception, bool displayException = true)
{
_logger.LogError(exception, $"Exception catched in middleware: {exception.Message}.");
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)httpCode;
var payload = JsonConvert.SerializeObject(new ApiError(displayException ? exception.Message : string.Empty));
return context.Response.WriteAsync(payload);
}
我尝试过的方法: 如果我尝试在中间件中添加该捕获
catch (Exception ex)
{
await HandleExceptionAsync(context, HttpStatusCode.InternalServerError, ex);
}
仍然有相同的结果,我没有得到500错误。 我真的不明白为什么我的回答没有被覆盖为500错误。 你有什么主意吗?
非常感谢。
答案 0 :(得分:1)
由于您没有显示_itemService.GetItemByIdAsync
。当我使用下面的代码进行500错误测试时,它会很好地工作。
public async Task<ActionResult<Item>> GetItemByIdAsync()
{
string json = @"{
'id': '2f5135a7-977c-4b26-a4e2-74b9e374a75e',
'name': null,
}";
Item x = JsonConvert.DeserializeObject<Item>(json);//throw 500 error using your Item model
return x;
}
您还可以将Required
属性用于JsonProperty,例如
[JsonProperty("name", Required = Required.Always)] //could not be null
public string Name { get; set; }
它的定义是:
//
// Summary:
// Indicating whether a property is required.
public enum Required
{
//
// Summary:
// The property is not required. The default state.
Default = 0,
//
// Summary:
// The property must be defined in JSON but can be a null value.
AllowNull = 1,
//
// Summary:
// The property must be defined in JSON and cannot be a null value.
Always = 2,
//
// Summary:
// The property is not required but it cannot be a null value.
DisallowNull = 3
}