我有一个 Web API 的 Controller ,它查询数据库并以 JSON 格式返回结果,如下所示,
[HttpGet]
public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT)
{
if (string.IsNullOrEmpty(ROOM))
{
return Request.CreateResponse(new { error = "Input paramete cannot be Empty or NULL" });
}
try
{
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));
string connStr = ConfigurationManager.ConnectionStrings["TBaseConnection"].ConnectionString;
using (OracleConnection dbconn = new OracleConnection(connStr))
{
DataSet userDataset = new DataSet();
var strQuery = "SELECT * from RESULTS_VW where ROOM = :ROOM and DOB > :DOB_GT";
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=TData.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}
}
catch (Exception ex)
{ var returnObj = new { error = ex.Message };
var response = Request.CreateResponse(HttpStatusCode.BadRequest, returnObj, MediaTypeHeaderValue.Parse("application/json"));
ContentDispositionHeaderValue contentDisposition = null;
if (ContentDispositionHeaderValue.TryParse("inline; filename=error.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}
}
}
而且 API 可以完美地处理有效的查询参数。但是我试图在 API 中出现任何异常时执行错误处理,它必须返回类似 {"error":"Exception Message"} 的 JSON。在上面的代码中,我有 catch block 来处理异常。但如果有任何异常,它不会返回任何东西。请建议我一种在异常情况下构建 JSON 的简单方法。
请您参考如下方法:
使用通用响应类来简化通信模型。为此,您将拥有;
- Generic Response 类(通用响应对象)
- 域响应模型(包含您的逻辑的类)
见下面的代码:
GenericResponse.cs
public class GeneicResponse<T> { private Response(){} public Response(T data) { this.Data = data; this.Error = String.Empty; } public Response(Exception ex) { this.Data = default(T); this.Error = ex.Message; } public T Data { get; set; } public string Error { get; set; } }DomainModel.cs
public class DomainModel { public int ID { get; set; } public string Name { get; set; } public DomainModel() { } public DomainModel(int id) { //populate object properties from database here } }你的 Controller 类:
[Route("api/myApiMethod")] public Response<DomainModel> GetDetails(string ROOM, DateTime DOB_GT) { try { DomainModel myDomainModel = new DomainModel(ROOM, DOB_GT); return new Response<DomainModel>(myDomainModel); } catch (Exception ex) { return new Response<DomainModel>(ex); } }
