c# - Modify .NET ApiController "BadResult()" to print custom JSON -


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