在Web API中处理错误时返回JSON

时间:2016-11-17 17:45:56

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

我创建了Web API,它接受在查询Oracle数据库中使用的四个输入参数,并以JSON格式返回结果。现在我试图处理URI中的任何异常,如果有任何输入参数缺失或格式错误。如果URI中的ROOM为空"error":"ROOM cannot be Empty or NULL"

,则返回JSON ROOM=&DOB_GT=01-SEP-05&DOB_LT=30-DEC-06&STATUS_TYPE=CMPLT
public class TGSDataController : ApiController
{
[HttpGet]
public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT, DateTime DOB_LT, string STATUS_TYPE)
{
    if (string.IsNullOrEmpty(ROOM))
    {
        var resp = new HttpResponseMessage()
        {
            Content = new StringContent("ROOM cannot be Empty or NULL")
        };
        resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        return resp;
    }
    List<OracleParameter> prms = new List<OracleParameter>();
    List<string> selectionStrings = new List<string>();
    prms.Add(new OracleParameter("ROOM", OracleDbType.Varchar2, ROOM, ParameterDirection.Input));
    prms.Add(new OracleParameter("DOB_GT", OracleDbType.Date, DOB_GT, ParameterDirection.Input));
    prms.Add(new OracleParameter("DOB_LT", OracleDbType.Date, DOB_LT, ParameterDirection.Input));
    prms.Add(new OracleParameter("STATUS_TYPE", OracleDbType.Varchar2, STATUS_TYPE, ParameterDirection.Input));

    string connStr = ConfigurationManager.ConnectionStrings["TGSDataBaseConnection"].ConnectionString;
    using (OracleConnection dbconn = new OracleConnection(connStr))
    {
        DataSet userDataset = new DataSet();
        var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = :ROOM and DOB > :DOB_GT and DOB < :DOB_LT and STATUS_TYPE= :STATUS_TYPE ";

        var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) };
        var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
        ContentDispositionHeaderValue contentDisposition = null;
        if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition))
        {
            response.Content.Headers.ContentDisposition = contentDisposition;
        }
        return response;
    }

使用上面的代码,它确实返回,如ROOM不能为空或NULL如何得到像"error":"ROOM cannot be Empty or NULL"。也有办法处理URLI中的错误并将JSON响应返回为"error":"Poorly Formed URI"

3 个答案:

答案 0 :(得分:0)

首先,WebAPI可以自动将任何对象序列化为JSON,您无需手动尝试构建HttpResponseMessage。

使用

Content = new StringContent("ROOM cannot be Empty or NULL")`

您只需将正常字符串添加到响应主体。

而是使用 Request.CreateResponse 扩展方法构建一个HttpResponseMessage,其中的任何对象都被序列化为JSON。

return Request.CreateResponse(HttpStatusCode.BadRequest,resp);

默认情况下,WebAPI将序列化响应在请求标头上的XML或JSON依赖项上。 为了强制JSON序列化,只需将其添加到 Application_Start()

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

现在关于例外情况。 默认情况下,WebAPI将自己处理抛出的异常,并返回默认的错误响应。

如果您想拦截此功能并在异常时返回自己的自定义响应,则应实现 ExceptionFilterAttribute

    public class BALExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
     {
        base.OnException(actionExecutedContext);
        actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { error = actionExecutedContext.Exception.Message });
    }
}

并将其添加到您的应用程序开始

GlobalConfiguration.Configuration.Filters.Add(new BALExceptionFilterAttribute());

最后,如果您有WebAPI 2.1,则可以使用Global ExceptionHandling

处理网址错误

否则这里有一些相关的问题。 custom-error-pages-for-non-existant-directory-file-web-api-not-controllers how-to-handle-webapi-error-404

答案 1 :(得分:0)

您可以轻松构建一个包含要返回的错误的匿名类型。

if (string.IsNullOrEmpty(ROOM))
    {
        return this.Request.CreateResponse(
        HttpStatusCode.BadRequest,
        new { error= "ROOM cannot be empty or NULL" });
        resp.Content.Headers.ContentType = 
           new MediaTypeHeaderValue("application/json");
        return resp;
    }

答案 2 :(得分:0)

尝试访问您的Web服务的客户端不会收到JSON格式的错误;相反,它会在客户端遇到错误。糟糕的URI不会让客户端到达返回JSON数据的服务器。

这应该回答你的第二个问题。

对于第一个,您有两个选择:您可以手动构建JSON返回,或者,您可以使用JSON库。

要手动完成,您可以使用以下内容:

    {"error":"ROOM cannot be Empty or NULL"}