Se erediti dalla base NegotitatedContentResult<T>, come accennato, e non hai bisogno di trasformare il tuo content(ad esempio, vuoi solo restituire una stringa), allora non hai bisogno di sovrascrivere il ExecuteAsyncmetodo.
Tutto quello che devi fare è fornire una definizione di tipo appropriata e un costruttore che indichi alla base quale codice di stato HTTP restituire. Tutto il resto funziona.
Ecco alcuni esempi per entrambi NotFounde InternalServerError:
public class NotFoundNegotiatedContentResult : NegotiatedContentResult<string>
{
public NotFoundNegotiatedContentResult(string content, ApiController controller)
: base(HttpStatusCode.NotFound, content, controller) { }
}
public class InternalServerErrorNegotiatedContentResult : NegotiatedContentResult<string>
{
public InternalServerErrorNegotiatedContentResult(string content, ApiController controller)
: base(HttpStatusCode.InternalServerError, content, controller) { }
}
E poi puoi creare metodi di estensione corrispondenti per ApiController(o farlo in una classe base se ne hai uno):
public static NotFoundNegotiatedContentResult NotFound(this ApiController controller, string message)
{
return new NotFoundNegotiatedContentResult(message, controller);
}
public static InternalServerErrorNegotiatedContentResult InternalServerError(this ApiController controller, string message)
{
return new InternalServerErrorNegotiatedContentResult(message, controller);
}
E poi funzionano proprio come i metodi integrati. Puoi chiamare l'esistente NotFound()o puoi chiamare la tua nuova abitudine NotFound(myErrorMessage).
E, naturalmente, puoi sbarazzarti dei tipi di stringa "hard-coded" nelle definizioni dei tipi personalizzati e lasciarli generici se vuoi, ma poi potresti doverti preoccupare delle ExecuteAsynccose, a seconda di cosa sei <T>effettivamente.
Puoi controllare il codice sorgente per NegotiatedContentResult<T>vedere tutto ciò che fa. Non c'è molto da fare.