Я работаю над проектом с использованием ASP.NET 5, и я пишу веб-api.Asp.net 5 веб-код возврата и тела тела api
Я унаследовал некоторые хранимые процедуры кода и базы данных, которые используют raiserror, чтобы указать, что что-то не так (неправильное имя пользователя/пароль, истекшая лицензия и т. Д.).
Хранимая процедура не возвращает ничего, чтобы однозначно идентифицировать эту ошибку, кроме текста сообщения.
Я хочу, чтобы иметь возможность возвращать ответ HTTP UNAUTHORIZED, а также передавать сообщение об ошибке вместе с клиентом.
Построенный в IActionResult HttpUnauthorized()
метод не дает повода для объяснения причин.
Так что я написал свой собственный ActionResult, который выглядит следующим образом:
public class UnauthorizedWithMessageResult : IActionResult
{
private readonly string _message;
public UnauthorizedWithMessageResult(string message)
{
_message = message;
}
public async Task ExecuteResultAsync(ActionContext context)
{
using (var sw = new HttpResponseStreamWriter(context.HttpContext.Response.Body, Encoding.UTF8))
{
await sw.WriteLineAsync(_message);
}
await new HttpUnauthorizedResult().ExecuteResultAsync(context);
}
}
Проблема заключается в том, что клиент получает 200-ОК, как все в порядке.
Я прошел через это, и после того, как делегации в HttpUnauthorizedResult
было сделано, код состояния действительно установлен в 403.
Похоже, Web API является (в какой-то момент), видя, что есть содержание в тело ответа и решает, что все в порядке и сбрасывает код состояния.
Есть ли способ обойти это без необходимости прибегать к отправке сообщения в виде заголовка или чего-то еще? (Или в том, что правильный способ сделать это?)
Вы не можете установить код статуса после того, как вы пишете какую-либо часть тела ответа. Вы пытались вызвать HttpUnauthorizedResult.ExecuteResultAsync перед написанием своего сообщения? – yaakov
выглядит эта ссылка может решить вашу проблему http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-creating-httpstatuscoderesult-with-view-based-body – Gomes
@Gomes, который выглядит очень перспективным! Я предполагаю, что концептуально это имеет смысл, нужно взглянуть скоро! – Clint