2012-09-04 110 views
10

Tengo un modelo de vista que se parece a.Serializar un objeto con restsharp y pasarlo a WebApi no serializar la lista

public class StoreItemViewModel 
{ 
    public Guid ItemId { get; set; } 
    public List<Guid> StoreIds { get; set; } 
    [Required] 
    public string Description { get; set; } 
    //[Required] 
    //[DataMember(IsRequired = true)] 
    public int ItemTypeId { get; set; } 


} 

Tengo un pequeño ayudante que está usando RestSharp.

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
    { 
     var client = new RestClient(CreateBaseUrl(null)) 
     { 
      Authenticator = new HttpBasicAuthenticator("user", "Password1") 
     }; 

     var request = new RestRequest(apiEndPoint, Method.POST); 
     //request.JsonSerializer = new JsonSerializer(); 
     // {RequestFormat = DataFormat.Json}; 
     request.AddObject(objectToUpdate); 
     // clientJsonSerializer = new YourCustomSerializer(); 
     var response = client.Execute<T>(request); 
     return response; 
    } 

Al depurar el controlador dentro de mi api productos

[HttpPost] 
    public HttpResponseMessage Create([FromBody]StoreItemViewModel myProduct) 
    { 
     //check fields are valid 
    ......... 
    } 

MyProducts están pobladas aparte de los StoreID lista pública que siempre se vuelven una sola recompensa con un Guid vacía. Incluso si he agregado 2 o más StoreIds

Supongo que es porque estoy haciendo algo mal con mi ayuda de Create en mi aplicación.

¿Alguien puede ayudar con esto es causando un gran dolor de cabeza.

Los datos en bruto se envían a la WebAPI está buscando como

ItemId=f6dbd244-e840-47e1-9d09-53cc64cd87e6&ItemTypeId=6&Description=blabla&StoreIds=d0f36ef4-28be-4d16-a2e8-37030004174a&StoreIds=f6dbd244-e840-47e1-9d09-53cc64cd87e6&StoreId=d0f36ef4-28be-4d16-a2e8-37030004174a 
+0

¿podría compartir cómo se ve la solicitud raw json? –

+0

@KiranChalla, ¿cómo lo consigo usando los bits de restsharp? –

+0

puede usar Fiddler, que es una httpproxy, para capturar las solicitudes/respuestas. –

Respuesta

18

me las arreglé para conseguir este trabajo. No creo que sea la manera correcta, pero funciona.

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
    { 
     var client = new RestClient(CreateBaseUrl(null)) 
     { 
      Authenticator = new HttpBasicAuthenticator("user", "Password1") 
     }; 
     var json = JsonConvert.SerializeObject(objectToUpdate); 
     var request = new RestRequest(apiEndPoint, Method.POST); 
     request.AddParameter("text/json", json, ParameterType.RequestBody); 
     var response = client.Execute<T>(request); 
     return response; 
    } 
+5

. Esta solución funcionó para mí. Sin embargo, tuve que usar "application/json" en lugar de "text/json". ¡Gracias! – carmbrester

+0

¿Alguna vez encontró una forma oficial de hacer esto? – chobo2

13

Luché con el mismo problema y encontré una solución de trabajo.

  1. Asegúrese de ajustar el formato de solicitud de JSON:

    request.RequestFormat = DataFormat.Json;

  2. Uso ADDBODY, en lugar de AddObject:

    request.AddBody (zNewSessionUsage);

lo que el código sería algo como esto:

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
{ 
    var client = new RestClient(CreateBaseUrl(null)) 
    { 
     Authenticator = new HttpBasicAuthenticator("user", "Password1") 
    }; 

    var request = new RestRequest(apiEndPoint, Method.POST); 
    request.RequestFormat = DataFormat.Json; 
    request.AddBody(objectToUpdate); 
    var response = client.Execute<T>(request); 
    return response; 
} 
+1

Y parece que .RequestFormat debe estar en la lista anterior.AddBody como en el ejemplo anterior, de lo contrario seguirá siendo Serialización XML por defecto. – Jafin

19

RestSharp ahora tiene una manera más racional para añadir un objeto a la RestRequest cuerpo con la serialización JSON:

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
{ 
    var client = new RestClient(CreateBaseUrl(null)) 
    { 
     Authenticator = new HttpBasicAuthenticator("user", "Password1") 
    }; 
    var request = new RestRequest(apiEndPoint, Method.POST); 
    request.AddJsonBody(objectToUpdate); // HERE 
    var response = client.Execute<T>(request); 
    return response; 
} 

Este se encontró en RestSharp 105.0.1.0