Как вернуть код статуса, описание состояния и текст вместе в MVC3?
Из моего действия контроллера MVC3 я хочу вернуть HTTP 403, установить "описание состояния" для некоторой конкретной строки, а также вернуть эту строку в результирующем содержимом, чтобы она была видна в браузере.
Я могу вернуть ContentResult
для указания содержимого, но не код состояния (например, 403), а не описание состояния. Я могу использовать HttpStatusCodeResult
для указания кода состояния и описания состояния, но не для содержимого результата.
Как создать результат действия, содержащий все три?
Ответы
Ответ 1
Обычно вы могли бы это сделать, установив код ответа, а затем вернув регулярный ActionResult
public ActionResult Foo()
{
Response.StatusCode = 403;
Response.StatusDescription = "Some custom message";
return View(); // or Content(), Json(), etc
}
Если вам действительно нужно, чтобы это ActionResult, вы создаете свой собственный.
Пример:
public class HttpStatusContentResult : ActionResult
{
private string _content;
private HttpStatusCode _statusCode;
private string _statusDescription;
public HttpStatusContentResult(string content,
HttpStatusCode statusCode = HttpStatusCode.OK,
string statusDescription = null)
{
_content = content;
_statusCode = statusCode;
_statusDescription = statusDescription;
}
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.StatusCode = (int) _statusCode;
if (_statusDescription != null)
{
response.StatusDescription = _statusDescription;
}
if (_content != null)
{
context.HttpContext.Response.Write(_content);
}
}
}
Ответ 2
Если это не слишком грязно
Response.Clear();
Response.Write("Some specific string");
return new HttpStatusCodeResult(403, "another specific string");
Ответ 3
Я сошел с ума, пытаясь заставить этот код работать, прежде чем я понял, что это GetAwaiter(). OnCompleted (...) в этом была проблема. Вот версия, в которой я работал:
public class ApiControllerBase : ApiController
{
...
// Other code
...
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
return base
.ExecuteAsync(controllerContext, cancellationToken)
.ContinueWith(t =>
{
t.Result.Headers.CacheControl = new CacheControlHeaderValue()
{
NoStore = true,
NoCache = true,
MaxAge = new TimeSpan(0),
MustRevalidate = true
};
t.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache"));
t.Result.Content.Headers.Expires = DateTime.Parse("01 Jan 1990 00:00:00 GMT");
return t.Result;
}, cancellationToken);
}
}