2016-03-24 2 views
6

Я работаю над проектом с использованием 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 является (в какой-то момент), видя, что есть содержание в тело ответа и решает, что все в порядке и сбрасывает код состояния.

Есть ли способ обойти это без необходимости прибегать к отправке сообщения в виде заголовка или чего-то еще? (Или в том, что правильный способ сделать это?)

+0

Вы не можете установить код статуса после того, как вы пишете какую-либо часть тела ответа. Вы пытались вызвать HttpUnauthorizedResult.ExecuteResultAsync перед написанием своего сообщения? – yaakov

+1

выглядит эта ссылка может решить вашу проблему http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-creating-httpstatuscoderesult-with-view-based-body – Gomes

+0

@Gomes, который выглядит очень перспективным! Я предполагаю, что концептуально это имеет смысл, нужно взглянуть скоро! – Clint

ответ

4

Он работает следующим образом:

public IActionResult IWillNotBeCalled() 
{ 
    return new UnauthorizedWithMessageResult("MY SQL ERROR");    
} 

public class UnauthorizedWithMessageResult : IActionResult 
{ 
    private readonly string _message; 

    public UnauthorizedWithMessageResult(string message) 
    { 
     _message = message; 
    } 

    public async Task ExecuteResultAsync(ActionContext context) 
    { 
     // you need to do this before setting the body content 
     context.HttpContext.Response.StatusCode = 403; 

     var myByteArray = Encoding.UTF8.GetBytes(_message); 
     await context.HttpContext.Response.Body.WriteAsync(myByteArray, 0, myByteArray.Length); 
     await context.HttpContext.Response.Body.FlushAsync(); 
    } 
} 

Вы должны установите StatusCode перед настройкой тела, и вам нужно очистить поток тела, чтобы убедиться, что контент будет установлен внутри ответа.

enter image description here

Надеется, что это помогает :)

0

Вы можете вернуть любой код статуса вы хотите, например, так:

return new HttpStatusCodeResult(403); 
+0

Это не код статуса, это проблема, это добавление некоторого текста в тело ответа вместе с кодом состояния, который доказывает быть сложными. – Clint

1

Вы можете сделать это:

return new ObjectResult("The message") { 
    StatusCode = (int?) HttpStatusCode.Unauthorized 
};