对于从Web API 2控制器返回,如果响应是OK(状态200),我可以返回内容与响应:

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

如果可能的话,我希望在这里尽可能使用内置结果类型

我的问题是,对于另一种类型的响应(不是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 InternalServerError(new Exception("SOME CUSTOM MESSAGE"));

其他回答

下面的代码/类确实有助于处理所有类型的响应。可能是成功或失败等。

为什么要用这个?:

假设我正在使用web API服务。输出有如下几种可能性:

由于验证错误,您可能得不到任何结果 你会得到预期的结果 你会得到错误。

So here I have solution to handle all the scenarios. Also I tried to maintain uniformity in the output. You can give remark or actual error message. The web service consumer can only check IsSuccess true or not else will sure there is problem, and act as per situation. There should be perfect communication between web API developer and web API consumer. If result is not generating then why. The comment or exception will acknowledge and they will act accordingly. Hence this is best solution for web API consumer / user.

对所有类型的结果进行单一响应。

  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 Request.CreateResponse(HttpStatusCode.OK, _res);
            }
            catch (Exception ex)
            {
                _res.IsSuccess = false;
                _res.ErrorMessage = ex;
                return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res )); 
            } 
        }

如有任何建议,欢迎您提出:)

如果有人使用并从中受益,我很高兴。如果有任何增加或修改使这更完善,请在akhandagale65@gmail.com上写信给我。

我最终采用了以下解决方案:

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);
    }
}

... 可以这样使用:

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

我愿意接受改进建议。:)

你还可以:

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

你可以使用HttpRequestMessagesExtensions。CreateErrorResponse (System.Net。Http命名空间),就像这样:

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

最好基于请求创建响应,以利用Web API的内容协商。

你可以用这个:

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