Якщо ви успадковуєте від бази NegotitatedContentResult<T>
, як згадувалося, і вам не потрібно перетворювати свій content
(наприклад, ви просто хочете повернути рядок), тоді вам не потрібно перевизначати ExecuteAsync
метод.
Все, що вам потрібно зробити, це надати відповідне визначення типу та конструктор, який повідомляє базі, який код стану HTTP повернути. Все інше просто працює.
Ось приклади для обох NotFound
та 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) { }
}
А потім ви можете створити відповідні методи розширення для ApiController
(або зробити це в базовому класі, якщо він у вас є):
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);
}
І тоді вони працюють так само, як і вбудовані методи. Ви можете або зателефонувати існуючому, NotFound()
або ви можете зателефонувати своєму новому користувачеві NotFound(myErrorMessage)
.
І звичайно, ви можете позбутися "жорстко закодованих" типів рядків у спеціальних визначеннях типів і залишити його загальним, якщо хочете, але тоді вам, можливо, доведеться турбуватися про ExecuteAsync
речі, залежно від того, що ви <T>
насправді є.
Ви можете переглянути в вихідний код для , NegotiatedContentResult<T>
щоб побачити все це робить. Тут не так багато.