【问题标题】:ASP.NET WebApi ApiController change StatusCodeASP.NET WebApi ApiController 更改 StatusCode
【发布时间】:2018-05-15 11:09:14
【问题描述】:

我在 .NET 中有一个 RESTful 服务,我希望所有操作都返回 JsonResult 类型的对象,JsonResult 是我这样定义的对象:

public class JsonResult<T>
{
    public Notify Notify {get; set;}
    public T Data {get; set;}

    public static CreateResponse(T Data, Notify Notify = null, HttpStatusCode Code = HttpStatusCode.OK)
    {
        //Code param not manage, at the moment

        return new JsonResult<T>
        {
            Data = Data,
            Notify = Notify
        };

    }
}

public class Notify
{
    public string Message {get; set;}
    public Severity Severity {get; set;}
}

public enum Severity
{
    Error,
    Info,
    Warning,
    Fatal,
}

所以目前我的动作是这样的:

public JsonResult<string> Get()
{

    return JsonResult<string>.CreateResponse("Ciao Mondo!");
}

它有效,我喜欢这种形式,因为当我阅读公司时,我已经知道我想要返回给客户的内容(JsonResult,T 是我的数据类型)......但问题是当我想要管理状态码。

在创建这个新项目之前,为了管理状态码,我使用了 HttpResponseMessage 和方法 Request.CreateResponse 来向客户端返回一些数据:

public HttpResponseMessage Get()
{

    return Request.CreateResponse(HttpStatusCode.BadRequest, "Ciao Mondo!");
}

但我不喜欢这样,因为知道返回的类型不是立即的。

所以...我的问题是...如何将状态代码管理到我的 JsonResult.CreateResponse(T, Notify[, HttpStatusCode]) 方法中?

这个方法被移动到一个 CustomApiController(从 ApiController 继承),所以我有 HttpContext 和 Request 可用。

非常感谢大家

【问题讨论】:

  • 如果您要返回响应,则意味着请求找到了所请求的实体,因此唯一合理的状态码是 200。除了 200 OK,您还想返回哪个状态码为什么?
  • 它并不总是正确的......如果我不能(出于一千个原因)执行我的代码的一部分,我想管理错误而不是将其扔给客户端。例如:我发现了一个超时,我想生成一个解释它的通知,这并不能说我有一个很好的响应并且我的请求得到了满足。

标签: c# .net asp.net-mvc asp.net-web-api


【解决方案1】:

您可以调用Content,它接受HttpStatusCode 以及通用对象。它确实需要您将方法的返回类型更改为IHttpActionResult,这通常是首选。

public IHttpActionResult Get()
{
  if(someErrorCondition)
     return Content(HttpStatusCode.BadRequest, JsonResult<string>.CreateResponse("Ciao Mondo!"));
  return Ok(JsonResult<string>.CreateResponse("Ciao Mondo!"));
}

【讨论】:

    【解决方案2】:

    优先使用IHttpActionResult,不要强行定义为 json结果。这应该可以通过内容协商进行配置。

    你可以尝试如下:

         public IHttpActionResult Get()
         {
          if(error)
              BadRequest("Bad Request !!");
           return Ok("Ciao Mondo!");
         }
    

    【讨论】:

      【解决方案3】:

      您的回答很有帮助。我一直在寻找另一种解决方案,但你给了我一个好主意,我找到了这个解决方案:

      public class CustomApiController : ApiController
      {
      
          public class JsonResult<Target> : NegotiatedContentResult<Target>
          {
              public JsonResult(HttpStatusCode statusCode, Json<Target> content, ApiController controller) : base(statusCode, content.Data, controller)
              {
      
                  this.Content = content;
              }
      
              public JsonResult(HttpStatusCode statusCode, Target content, ApiController controller) : base(statusCode, content, controller)
              {
      
              }
      
              public JsonResult(HttpStatusCode statusCode, Target content, IContentNegotiator contentNegotiator, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
                  : base(statusCode, content, contentNegotiator, request, formatters)
              {
      
              }
      
              public new Json<Target> Content { get; private set; }
      
          }
      
      
          public JsonResult<Target> CreateResponse<Target>(Target Data, string Notify, HttpStatusCode Code = HttpStatusCode.OK)
          {
              Json<Target> json = new Json<Target>
              {
                  Notify = Notify,
                  Data = Data
              };
      
              return new JsonResult<Target>(Code, json, this);
          }
      
      }
      

      所以我可以从 CustomApiController 继承并编写这样的操作:

          public JsonResult<IEnumerable<string>> Get(bool test)
          {
              if (test)
              {
                  return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.OK);
              }
              else
              {
                  return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.BadRequest);
              }
          }
      

      非常感谢!

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 2013-09-24
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 2015-03-18
        • 1970-01-01
        • 2021-07-20
        相关资源
        最近更新 更多