with validate tutorial started net isvalid asp apicontroller asp.net-web-api consumer

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.



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;