Renvoie le contenu avec IHttpActionResult pour une réponse non OK

Pour retourner à partir d'un contrôleur Web API 2, je peux renvoyer du contenu avec la réponse si la réponse est OK (statut 200) comme ceci:

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

Si possible, je veux utiliser les types de résultats intégrés ici si possible: https://msdn.microsoft.com/en-us/library/system.web.http.results (v = vs. 118).aspx

Ma question Est, pour un autre type de réponse (pas 200), Comment puis-je retourner un message (chaîne) avec? Par exemple, je peux faire ceci:

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

Mais pas ce:

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

Idéalement, je veux que cela soit généralisé afin que je puisse renvoyer un message avec l'une des implémentations de IHttpActionResult.

Dois-je le faire (et construire mon propre message de réponse):

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

Ou y a-t-il un meilleur moyen?

132
demandé sur abatishchev 2015-02-18 19:29:34

14 réponses

Vous pouvez utiliser ceci:

return Content(HttpStatusCode.BadRequest, "Any object");
337
répondu Shamil Yakupov 2015-10-10 12:05:18

Vous pouvez utiliser HttpRequestMessagesExtensions.CreateErrorResponse (System.Net.Http espace de noms), comme ceci:

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

Il est préférable de créer des réponses basées sur la demande pour tirer parti de la négociation de contenu de L'API Web.

45
répondu user1620220 2015-07-06 13:34:55

J'ai fini par aller avec la solution suivante:

public class HttpActionResult : IHttpActionResult
{
    private readonly string _message;
    private readonly HttpStatusCode _statusCode;

    public HttpActionResult(HttpStatusCode statusCode, string message)
    {
        _statusCode = statusCode;
        _message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage(_statusCode)
        {
            Content = new StringContent(_message)
        };
        return Task.FromResult(response);
    }
}

... qui peut être utilisé comme ceci:

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

Je suis ouvert aux suggestions d'amélioration. :)

23
répondu mayabelle 2015-02-18 16:59:35

Vous pouvez également faire:

return InternalServerError(new Exception("SOME CUSTOM MESSAGE"));
13
répondu ilans 2015-05-14 13:22:51

Toute personne intéressée à retourner quelque chose avec n'importe quel statuscode avec returning ResponseMessage:

//CreateResponse(HttpStatusCode, T value)
return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object));
7
répondu CularBytes 2015-12-06 14:17:14

Dans ASP.NET API Web 2, Vous pouvez envelopper n'importe quel ResponseMessage dans un ResponseMessageResult :

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

Dans certains cas, cela peut être le moyen le plus simple d'obtenir le résultat souhaité, bien qu'il soit généralement préférable d'utiliser les différents résultats dans le système .Web.Http.Résultats .

6
répondu sfuqua 2017-01-09 19:28:56

@ mayabelle vous pouvez créer IHttpActionResult concrete et envelopper ce code comme ceci:

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<HttpResponseMessage> 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;
    }
}
1
répondu Quoc Nguyen 2015-03-03 09:20:55

J'ai eu le même problème. Je veux créer un résultat personnalisé pour mes contrôleurs d'api, pour les appeler comme return Ok("some text");

Alors j'ai fait ça: 1) Créer un type de résultat personnalisé avec singletone

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

2) Créer un contrôleur personnalisé avec une nouvelle méthode:

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

Et puis je peux les appeler dans mes contrôleurs, comme ceci:

public IHttpActionResult SomeMethod()
    {
       return EmptyResult();
    }
0
répondu Merchezatter 2017-06-28 17:06:19

Cette réponse est basée sur la réponse de Shamil Yakupov, avec un objet réel au lieu d'une chaîne.

using System.Dynamic;

dynamic response = new ExpandoObject();
response.message = "Email address already exist";

return Content<object>(HttpStatusCode.BadRequest, response);
0
répondu Kugan Kumar 2017-11-18 10:22:28

Pour les exceptions, je fais habituellement

 catch (Exception ex)
        {
            return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.Message));
        }
0
répondu ahsant 2018-02-14 02:32:32

Les choses ci-dessus sont vraiment utiles.

Lors de la création de services web, si vous prenez le cas des Services consommateurs sera grandement apprécié. J'ai essayé de maintenir l'uniformité de la sortie. Vous pouvez également donner une remarque ou un message d'erreur réel. Le consommateur de service web peut seulement vérifier IsSuccess vrai ou pas d'autre sera sûr qu'il y a un problème, et agir selon la situation.

  public class Response
    {
        /// <summary>
        /// Gets or sets a value indicating whether this instance is success.
        /// </summary>
        /// <value>
        /// <c>true</c> if this instance is success; otherwise, <c>false</c>.
        /// </value>
        public bool IsSuccess { get; set; } = false;

        /// <summary>
        /// Actual response if succeed 
        /// </summary>
        /// <value>
        /// Actual response if succeed 
        /// </value>
        public object Data { get; set; } = null;

        /// <summary>
        /// Remark if anythig to convey
        /// </summary>
        /// <value>
        /// Remark if anythig to convey
        /// </value>
        public string Remark { get; set; } = string.Empty;
        /// <summary>
        /// Gets or sets the error message.
        /// </summary>
        /// <value>
        /// The error message.
        /// </value>
        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<Response>(_res);
            }
            catch (Exception ex)
            {
                _res.IsSuccess = false;
                _res.ErrorMessage = ex;
                return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res )); 
            } 
        }

Vous êtes invités à donner une suggestion le cas échéant:)

0
répondu Amol Khandagale 2018-04-27 09:05:19

Je recommande de lire ce post. Il y a des tonnes de façons d'utiliser HttpResponse existant comme suggéré, mais si vous voulez profiter de L'Api Web 2, alors regardez en utilisant certaines des options IHttpActionResult intégrées telles que

return Ok() 

Ou

return NotFound()

Choisissez le bon type de retour pour les contrôleurs D'Api Web

0
répondu wegunterjr 2018-06-01 17:50:54

Simple:

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

N'oubliez pas de faire référence à System. Net. Http et System.Net .

0
répondu Rodrigo Reis 2018-08-10 14:18:53

Désolé pour la réponse tardive pourquoi n'utilisez-vous pas simplement

return BadRequest("your message");

Je l'utilise pour toutes mes erreurs IHttpActionResult cela fonctionne bien

Voici la documentation : https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx

-1
répondu benraay 2016-11-05 23:32:13