IHttpActionResult-как использовать?
Я видел примеры использования некоторых новых IHttpActionResults для OK, NotFound.
Я ничего не видел, используя Unauthorized()
.
мой существующий код выглядит так:
catch (SecurityException ex)
{
request.CreateResponse(HttpStatusCode.Unauthorized, ex.Message);
}
Я хотел бы заменить его следующим:
catch (SecurityException ex)
{
response = Unauthorized();
}
но я не вижу никакой перегрузки для передачи деталей исключения.
кроме того, что такое IHttpActionResult
эквивалент возврата ошибки 500?
catch (Exception ex)
{
response = request.CreateErrorResponse(HttpStatusCode.InternalServerError,
ex.Message);
}
3 ответов
в коде ApiController, есть только две перегрузки для Unauthorized()
:
/// <summary>
/// Creates an <see cref="UnauthorizedResult"/> (401 Unauthorized) with the specified values.
/// </summary>
/// <param name="challenges">The WWW-Authenticate challenges.</param>
/// <returns>An <see cref="UnauthorizedResult"/> with the specified values.</returns>
protected internal UnauthorizedResult Unauthorized(params AuthenticationHeaderValue[] challenges)
{
return Unauthorized((IEnumerable<AuthenticationHeaderValue>)challenges);
}
/// <summary>
/// Creates an <see cref="UnauthorizedResult"/> (401 Unauthorized) with the specified values.
/// </summary>
/// <param name="challenges">The WWW-Authenticate challenges.</param>
/// <returns>An <see cref="UnauthorizedResult"/> with the specified values.</returns>
protected internal virtual UnauthorizedResult Unauthorized(IEnumerable<AuthenticationHeaderValue> challenges)
{
return new UnauthorizedResult(challenges, this);
}
таким образом, похоже, вам не повезло, если вы не хотите сделать изменение самостоятельно (вилка вашей собственной версии WebAPI или сделать запрос на вытягивание, чтобы попытаться получить его в основную ветку).
на IHttpActionResult
эквивалент возврата ошибки 500 заключается в следующем:
/// <summary>
/// Creates an <see cref="ExceptionResult"/> (500 Internal Server Error) with the specified exception.
/// </summary>
/// <param name="exception">The exception to include in the error.</param>
/// <returns>An <see cref="ExceptionResult"/> with the specified exception.</returns>
protected internal virtual ExceptionResult InternalServerError(Exception exception)
{
return new ExceptionResult(exception, this);
}
вы можете узнать больше о Unathorized() здесь Как вы возвращаете статус 401 из WebAPI в AngularJS, а также включаете пользовательское сообщение? Если найден другой способ-без создания исключения и использования HttpResponseMessage в качестве возвращаемого типа вашего контроллера, вы можете сделать это следующим образом:
return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "I am unauthorized IHttpActionResult custom message!"));
подробнее о ResponseMessage() здесь http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.responsemessage%28v=vs.118%29.aspx
Это мое решение для исключения 500 с пользовательским сообщением (развернуто отсюда:https://stackoverflow.com/a/10734690/654708)
базовый класс для всех контроллеров Web API
public abstract class ApiBaseController : ApiController
{
protected internal virtual IHttpActionResult InternalServerError(Exception ex, string message = null)
{
var customMsg = String.IsNullOrWhiteSpace(message) ? "" : String.Format("Custom error message : {0}. ", message);
var errorMsg = String.Format("{0}{1}", customMsg, ex);
return new InternalServerErrorWithMessageResult(errorMsg);
}
}
public class InternalServerErrorWithMessageResult : IHttpActionResult
{
private readonly string message;
public InternalServerErrorWithMessageResult(string message)
{
this.message = message;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(message)
};
return Task.FromResult(response);
}
}
примеры контроллеров Web API
public class ProductController : ApiBaseController
{
public IHttpActionResult GetProduct(int id)
{
try
{
var product = productService.GetProduct(id);
return Ok(product); // 200 w/ product
} catch(Exception ex)
{
//return InternalServerError(ex); // Uses default InternalServerError
return InternalServerError(ex, "My custom message here"); // Uses custom InternalServerError
}
}
}