ASP.NET WebApi ApiController更改StatusCode

时间:2018-05-15 11:09:15

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

我在.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!");
}

它有效,我喜欢这种形式&#39;因为当我读到公司时我已经知道我想要回到客户端(JsonResult,T是我的数据类型)......但问题是什么时候我想管理状态代码。

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

public HttpResponseMessage Get()
{

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

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

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

此方法被移入CustomApiController(继承自ApiController),因此我有HttpContext和Request可用。

非常感谢所有人

3 个答案:

答案 0 :(得分:1)

您可以致电Content,该{{3}}接受Original column: ABC-DEF-PQR-XYZ New col1 : ABC New col2 : ABC-DEF New col3 : ABC-DEF-PQR New col4 : ABC-DEF-PQR-XYZ 以及通用对象。它确实要求您将方法的返回类型更改为HttpStatusCode,这通常是首选。

IHttpActionResult

答案 1 :(得分:0)

它首选使用IHttpActionResult,不要强行定义它    JsonResult。这应该可以通过内容协商进行配置。

您可以尝试如下:

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

答案 2 :(得分:0)

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

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

非常感谢!