i using .net pattern controller action has signature such
public async task<ihttpactionresult> gettimeseries(string deviceid, string tag) { ... }
and inside controller want send custom error message adhering json api spec
my goal when encountering error use
return badrequest(somejsonerrorobject);
or
return notfound(somejsonerrorobject);
rather throw exception.
currently if
return badrequest(jsonconvert.serializeobject(somejsonerrorobject));
the json looks like
{ "message": "{\"data\":null,\"errors\":[{\"detail\":\"the string not recognized valid datetime. there unknown word starting @ index 0.\"}],\"meta\":null}" }
create custom ihttpactionresult
public class customresponseresult<t> : ihttpactionresult { public customresponseresult(httpstatuscode statuscode, t content, httprequestmessage request) { content = content; request = request; statuscode = statuscode; } public t content { get; private set; } public httprequestmessage request { get; private set; } public httpstatuscode statuscode { get; private set; } public task<httpresponsemessage> executeasync(cancellationtoken cancellationtoken) { return task.fromresult(execute()); } private httpresponsemessage execute() { var response = request.createresponse(statuscode, content); response.requestmessage = request; response.reasonphrase = statuscode.tostring(); return response; } }
and in order maintain usability create extension methods
public static class apicontrollerextensions { public static ihttpactionresult badrequest<t>(this apicontroller controller, t content) { return controller.customresponse(httpstatuscode.badrequest, content); } public static ihttpactionresult notfound<t>(this apicontroller controller, t content) { return controller.customresponse(httpstatuscode.notfound, content); } public static ihttpactionresult customresponse<t>(this apicontroller controller, httpstatuscode statuscode, t content) { var request = controller.request; var result = new customresponseresult<t>(statuscode, content, request); return result; } }
that allowed calls wanted
return this.badrequest(somejsonerrorobject);
or
return this.notfound(somejsonerrorobject);
Comments
Post a Comment