Если вы наследуете от базы 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>
чтобы увидеть все это делает. В этом нет ничего особенного.