错误响应和ODataError序列化

时间:2017-06-15 09:01:12

标签: c# json asp.net-web-api odata

我有一个Web API 2 OData服务,如果有问题,我会返回包含ODataError的HttpResponseException,例如

    public ActionResult Post(Customer entity)
    {
        try
        {
            Repository.Save(entity);
        }
        catch (Exception ex)
        {
            throw ODataException(500, ex);
        }
    }

    protected virtual Exception ODataException(HttpStatusCode code, string message = null, Exception ex = null, IList<ODataErrorDetail> details = null)
    {
        return ODataException(code, code.ToODataError(message, ex, details, !Request.ShouldIncludeErrorDetail()));
    }

    protected virtual Exception ODataException(HttpStatusCode code, ODataError error)
    {
        var message = Request.CreateErrorResponse(code, error);

        return new HttpResponseException(message);
    }

如其他地方所述,Error Handling for ASP.NET OData Web API,因为OData V3有一个标准的序列化响应,看起来像这样......

{
    "error": {
        "code": "A custom error code",
        "message": {
            "lang": "en-us",
            "value": "A custom long message for the user." 
        },
        "innererror": {
            "trace": [...],
            "context": {...}
        }
    }
}

然而,似乎并不是将响应转换回ODataError的简单方法。

现在我可以编写一个自定义JSON转换器来执行此操作,但奇怪的是OData库中没有这个。

1 个答案:

答案 0 :(得分:0)

有一个非常标准的库可以通过NuGet添加,名为Newton Json Converter。可以找到文档here

反序列化示例:

string json = @"{
"error": {
    "code": "A custom error code",
    "message": {
        "lang": "en-us",
        "value": "A custom long message for the user." 
    },
    "innererror": {
        "trace": [...],
        "context": {...}
    }
  }
}";

var oDataError = JsonConvert.DeserializeObject<ODataError>(json);