Comprobando ModelState en ApiController

Here is the POST action in my ApiController.

public HttpResponseMessage Post(ViewModel model)
    {
        if (!ModelState.IsValid)
        {
            var ResponseMessage = new HttpResponseMessage(HttpStatusCode.XXXXXX
            return ResponseMessage; 
        }

        if (!_service.Create(model))
        {
            var ResponseMessage=new HttpResponseMessage(HttpStatusCode.NotAcceptable);
            return ResponseMessage;
        }
        else
        {
            return new HttpResponseMessage(HttpStatusCode.Created);
        }
    }

¿Está bien habilitar la validación del modelo del lado del servidor de esta manera? Y, estoy bastante seguro de que un Created debe ser devuelto si todo está bien. Pero, ¿qué tipo de HttpStatusCode debo devolver si ModelState no es válido o si ocurre algún error?

preguntado el 22 de mayo de 12 a las 20:05

1 Respuestas

Normally it should be 400 - BadRequest.

NotAcceptable is when Accept headers cannot be satisfied by the server.

PreConditionFailed is when caching validation conditions fails. For example, if a PUT request requires update if and only if ETag match value in the request.


Alternativamente, puede enviar un error personalizado. Como tiene que ver con la solicitud, debe usar números 4xx:

return new HttpResponseMessage((HttpStatusCode) 499) 
     {
          ReasonPhrase = "Validation failed"
     };

contestado el 22 de mayo de 12 a las 23:05

Is there a way we can distinguish between invalid input (ModelState.IsValid==false) y otro error? - Blaise

@Blaise ¿Qué error? Si el error está en el servidor, será un error de la serie 500. 400 es cuando la solicitud no es válida. Si especifica exactamente qué otro error podría ayudar. - Alióstad

Gracias. Devolveré un 400 cuando el modelo no sea válido y devolveré un 500 cuando falle el servicio del trabajador (lo que indica que es un error del servidor que no es un modelo no válido). - Blaise

@Blaise sí. Aunque cuando dije 500 me refería a 5xx. Echa un vistazo a la especificación HTTP: w3.org/Protocols/rfc2616/rfc2616-sec10.html - Alióstad

¡Guau! Razón Frase. Me gusta eso. Gracias. - Blaise

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.