asp.net-web-api - validate - modelstate.isvalid c#
¿Cómo recuperar el mensaje de la API WEB? (5)
Asegúrese de configurar la aceptación y / o el tipo de contenido de manera adecuada (posible fuente de 500 errores al analizar el contenido de la solicitud):
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
Entonces podrías simplemente hacer:
var errorMessage = response.Content.ReadAsStringAsync().Result;
Eso es todo en el cliente, por supuesto. WebApi debe manejar el formato del contenido de acuerdo con el tipo de aceptación y / o contenido. Curioso, también puede ser capaz de throw new HttpResponseException("Failed to find customer.", HttpStatusCode.NotFound);
Creé algunas API web y cuando ocurre un error, la API devuelve HttpResponseMessage que se crea con el mensaje CreateErrorResponse Algo como esto:
return Request.CreateErrorResponse(
HttpStatusCode.NotFound, "Failed to find customer.");
Mi problema es que no puedo averiguar cómo recuperar el mensaje (en este caso, " Error al encontrar al cliente ") en la aplicación del consumidor.
Aquí hay una muestra del consumidor:
private static void GetCustomer()
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string data =
"{/"LastName/": /"Test/", /"FirstName/": /"Test/"";
var content = new StringContent(data, Encoding.UTF8, "application/json");
var httpResponseMessage =
client.PostAsync(
new Uri("http://localhost:55202/api/Customer/Find"),
content).Result;
if (httpResponseMessage.IsSuccessStatusCode)
{
var cust = httpResponseMessage.Content.
ReadAsAsync<IEnumerable<CustomerMobil>>().Result;
}
}
Cualquier ayuda es muy apreciada.
Debe estar en HttpResponseMessage.ReasonPhrase. Si eso suena como un nombre un poco extraño, es solo porque así se llama en la especificación HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
Esta es una opción para obtener el mensaje de la respuesta de error que evita realizar un tipo de llamada ...Async().Result()
.
((HttpError)((ObjectContent<HttpError>)response.Content).Value).Message
ObjectContent<HttpError>
embargo, debe asegurarse de que la response.Content
es de tipo ObjectContent<HttpError>
primer lugar.
OK, esto es divertido, pero al usar QuickWatch se me ocurrió esta solución elegante:
(nuevo System.Collections.Generic.Mscorlib_DictionaryDebugView ((System.Web.Http.HttpError) ((System.Net.Http.ObjectContent) (httpResponseMessage.Content)).
Eso es super legible!
Una forma de recibir el mensaje es hacer:
((ObjectContent)httpResponseMessage.Content).Value
Esto le dará un diccionario que contiene también el Message
.
ACTUALIZAR
Consulte la página oficial:
msdn.microsoft.com/en-us/library/jj127065(v=vs.108).aspx
Tiene que variar la forma en que está leyendo la respuesta exitosa y la respuesta de error, ya que una está obviamente en su caso StreamContent, y la otra debe ser ObjectContent.
ACTUALIZACIÓN 2
¿Has intentado hacerlo de esta manera?
if (httpResponseMessage.IsSuccessStatusCode)
{
var cust = httpResponseMessage.Content.
ReadAsAsync<IEnumerable<CustomerMobil>>().Result;
}
else
{
var content = httpResponseMessage.Content as ObjectContent;
if (content != null)
{
// do something with the content
var error = content.Value;
}
else
{
Console.WriteLine("content was of type ", (httpResponseMessage.Content).GetType());
}
}
ACTUALIZACIÓN FINAL (con suerte ...)
OK, ahora lo entiendo, solo intenta hacer esto en su lugar:
httpResponseMessage.Content.ReadAsAsync<HttpError>().Result;