对于从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);
}

还是有更好的办法?


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

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

最好基于请求创建响应,以利用Web 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<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
}

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


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

你还可以:

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

你可以用这个:

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

任何对返回任何statuscode和ResponseMessage感兴趣的人:

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

抱歉回答晚了为什么不简单使用

return BadRequest("your message");

我使用它为我所有的IHttpActionResult错误它工作得很好

以下是文档:https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx


在ASP。你可以在一个ResponseMessageResult中包装任何ResponseMessage:

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

在某些情况下,这可能是获得所需结果的最简单方法,尽管通常使用System.Web.Http.Results中的各种结果可能更可取。


我也有同样的问题。我想为我的api控制器创建自定义结果,像这样调用它们 return Ok("some text");

然后我这样做了: 1)使用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)使用new方法创建自定义控制器:

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

然后我可以在我的控制器中调用它们,像这样:

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

这个答案是基于Shamil Yakupov的答案,用真实的对象而不是字符串。

using System.Dynamic;

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

return Content<object>(HttpStatusCode.BadRequest, response);

对于例外情况,我通常会这样做

 catch (Exception ex)
        {
            return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.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上写信给我。


我建议你阅读这篇文章。有很多方法可以使用现有的HttpResponse,但是如果您想利用Web Api 2,那么可以考虑使用一些内置的IHttpActionResult选项,例如

return Ok() 

or

return NotFound()

为Web Api控制器选择正确的返回类型


简单:

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

记住引用System.Net.Http和System.Net。


一个更详细的示例,支持在c# HttpStatusCode中未定义的HTTP代码。

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpStatusCode codeNotDefined = (HttpStatusCode)429;
        return Content(codeNotDefined, "message to be sent in response body");
    }
}

Content是在抽象类ApiController(控制器的基类)中定义的虚方法。声明如下:

protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);

你可以用这个:

return BadRequest("No data is present in table!!");