Возвращать содержимое с помощью IHttpActionResult для ответа без ответа

Для возврата из controllerа Web API 2 я могу вернуть контент с ответом, если ответ в порядке (состояние 200) выглядит следующим образом:

public IHttpActionResult Get() { string myResult = ... return Ok(myResult); } 

Если возможно, я хочу, когда это возможно, использовать встроенные типы результатов: https://msdn.microsoft.com/en-us/library/system.web.http.results(v=vs.118).aspx

Мой вопрос в том, что для другого типа ответа (не 200), как я могу вернуть ему сообщение (строку)? Например, я могу это сделать:

  public IHttpActionResult Get() { return InternalServerError(); } 

но не это:

  public IHttpActionResult Get() { return InternalServerError("Message describing the error here"); } 

В идеале я хочу, чтобы это было обобщено, чтобы я мог отправить сообщение обратно с любой из реализаций IHttpActionResult.

Нужно ли мне это делать (и создать собственное ответное сообщение):

  public IHttpActionResult Get() { HttpResponseMessage responseMessage = ... return ResponseMessage(responseMessage); } 

или есть лучший способ?

Вы можете использовать это:

 return Content(HttpStatusCode.BadRequest, "Any object"); 

Вы можете использовать HttpRequestMessagesExtensions.CreateErrorResponse (пространство имен System.Net.Http ), например:

 public IHttpActionResult Get() { return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Message describing the error here")); } 

Предпочтительно создавать ответы на основе запроса, чтобы использовать преимущества согласования содержимого веб-API.

В итоге я решил использовать следующее решение:

 public class HttpActionResult : IHttpActionResult { private readonly string _message; private readonly HttpStatusCode _statusCode; public HttpActionResult(HttpStatusCode statusCode, string message) { _statusCode = statusCode; _message = message; } public Task ExecuteAsync(CancellationToken cancellationToken) { HttpResponseMessage response = new HttpResponseMessage(_statusCode) { Content = new StringContent(_message) }; return Task.FromResult(response); } } 

… которые можно использовать следующим образом:

 public IHttpActionResult Get() { return new HttpActionResult(HttpStatusCode.InternalServerError, "error message"); // can use any HTTP status code } 

Я открыт для предложений по улучшению. 🙂

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

 return InternalServerError(new Exception("SOME CUSTOM MESSAGE")); 

Любой, кто заинтересован в возвращении чего-либо с любым кодом состояния с возвратом ResponseMessage:

 //CreateResponse(HttpStatusCode, T value) return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object)); 

В ASP.NET Web API 2 вы можете обернуть любой ResponseMessage в ResponseMessageResult :

 public IHttpActionResult Get() { HttpResponseMessage responseMessage = ... return new ResponseMessageResult(responseMessage); } 

В некоторых случаях это может быть самый простой способ получить желаемый результат, хотя обычно бывает предпочтительнее использовать различные результаты в System.Web.Http.Results .

@mayabelle вы можете создать бетон IHttpActionResult и обернуть этот код следующим образом:

 public class NotFoundPlainTextActionResult : IHttpActionResult { public NotFoundPlainTextActionResult(HttpRequestMessage request, string message) { Request = request; Message = message; } public string Message { get; private set; } public HttpRequestMessage Request { get; private set; } public Task ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(ExecuteResult()); } public HttpResponseMessage ExecuteResult() { var response = new HttpResponseMessage(); if (!string.IsNullOrWhiteSpace(Message)) //response.Content = new StringContent(Message); response = Request.CreateErrorResponse(HttpStatusCode.NotFound, new Exception(Message)); response.RequestMessage = Request; return response; } } 

Просто:

return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Your message"));

Не забудьте указать System.Net.Http и System.Net .

У меня такая же проблема. Я хочу создать пользовательский результат для своих api-controllerов, чтобы называть их return Ok("some text");

Затем я сделал следующее: 1) Создал пользовательский тип результата с одиночным

 public sealed class EmptyResult : IHttpActionResult { public Task ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.NoContent) { Content = new StringContent("Empty result") }); } } 

2) Создайте пользовательский controller с помощью нового метода:

 public class CustomApiController : ApiController { public IHttpActionResult EmptyResult() { return new EmptyResult(); } } 

И тогда я могу назвать их в своих controllerах, например:

 public IHttpActionResult SomeMethod() { return EmptyResult(); } 

этот ответ основан на ответе Шамиля Якупова, с реальным объектом вместо строки.

 using System.Dynamic; dynamic response = new ExpandoObject(); response.message = "Email address already exist"; return Content(HttpStatusCode.BadRequest, response); 

Для исключений я обычно делаю

  catch (Exception ex) { return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.Message)); } 

Выше всего очень полезно.

При создании веб-сервисов, если вы примете случай услуг, то потребители будут очень благодарны. Я пытался поддерживать единообразие выпуска. Также вы можете дать примечание или фактическое сообщение об ошибке. Пользователь веб-службы может проверять только IsSuccess true или нет, будет уверен, что есть проблема, и действовать в соответствии с ситуацией.

  public class Response { ///  /// Gets or sets a value indicating whether this instance is success. ///  ///  /// true if this instance is success; otherwise, false. ///  public bool IsSuccess { get; set; } = false; ///  /// Actual response if succeed ///  ///  /// Actual response if succeed ///  public object Data { get; set; } = null; ///  /// Remark if anythig to convey ///  ///  /// Remark if anythig to convey ///  public string Remark { get; set; } = string.Empty; ///  /// Gets or sets the error message. ///  ///  /// The error message. ///  public object ErrorMessage { get; set; } = null; } [HttpGet] public IHttpActionResult Employees() { Response _res = new Response(); try { DalTest objDal = new DalTest(); _res.Data = objDal.GetTestData(); _res.IsSuccess = true; return Ok(_res); } catch (Exception ex) { _res.IsSuccess = false; _res.ErrorMessage = ex; return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res )); } } 

Вы можете дать предложение, если оно есть 🙂

Я бы рекомендовал прочитать этот пост. Существует много способов использовать существующий HttpResponse, как было предложено, но если вы хотите воспользоваться Web Api 2, посмотрите на некоторые из встроенных параметров IHttpActionResult, таких как

 return Ok() 

или же

 return NotFound() 

Выберите правильный тип возврата для Web Api Controllers

Извините за поздний ответ, почему бы вам просто не использовать

return BadRequest("your message");

Я использую его для всех ошибок IHttpActionResult он хорошо работает

вот документация: https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx