ASP.NET WebApi ApiController изменить StatusCode - PullRequest
0 голосов
/ 15 мая 2018

У меня есть служба RESTful в .NET, и я хотел бы, чтобы все действия возвращали объект типа 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 доступны.

Большое спасибо всем

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Предпочитается использовать IHttpActionResult, не устанавливайте его принудительно JsonResult. Это должно быть конфигурировано через согласование контента.

Вы можете попробовать, как показано ниже:

     public IHttpActionResult Get()
     {
      if(error)
          BadRequest("Bad Request !!");
       return Ok("Ciao Mondo!");
     }
0 голосов
/ 15 мая 2018

Ваш ответ был очень полезным.Я искал другое решение, но вы дали мне хорошую идею, и я нашел это решение:

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

Большое спасибо!

0 голосов
/ 15 мая 2018

Вы можете вызвать Content , который принимает HttpStatusCode, а также универсальный объект.Это требует, чтобы вы изменили тип возврата вашего метода на IHttpActionResult, который обычно предпочтительнее.

public IHttpActionResult Get()
{
  if(someErrorCondition)
     return Content(HttpStatusCode.BadRequest, JsonResult<string>.CreateResponse("Ciao Mondo!"));
  return Ok(JsonResult<string>.CreateResponse("Ciao Mondo!"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...