Estoy tratando de enviar una lista de cadenas a la API web y esta lista la estoy inicializando en el constructor de clases y la misma clase que estoy pasando a la API web.

Cuando estoy inicializando la clase; la lista se completa correctamente, pero después de enviarla a la API web, los mismos elementos se vuelven a agregar a la lista. No estoy seguro de por qué sucede esto.

Como estoy aceptando estos valores del cliente; Si el cliente no proporciona ningún valor, entonces quiero completar el valor predeterminado en la lista.

A continuación está mi código

public class RequestDto
    {
        public RequestDto()
        {
            TypeNames = new List<string>();
            TypeNames.Add(new string("Type1"));
            TypeNames.Add(new string("Type2"));
            TypeNames.Add(new string("Type3"));

        }

        public string CompanyName { get; set; }
        public string Version { get; set; }
        public List<string> TypeNames { get; set; }
    }

Y luego paso la clase a la API web como a continuación

using (var client = new HttpClient())
            {
                string url = "some url";

                var postTask = client.PostAsJsonAsync(url, objrequestdto);
                postTask.Wait();

                if (postTask.Result.IsSuccessStatusCode)
                {
                    // Do Something
                }
            }

Y debajo está mi API donde después de recibir el parámetro puedo ver que los elementos se están agregando nuevamente.

[HttpPost]
        public IActionResult GetTypeDetails([FromBody] RequestDto requestdto) // Here I am getting duplicate/Repeated Values
        {
            try
            {
                // Some logic

            }
            catch (Exception e)
            {
                Log.Error("Some Error");
                return StatusCode(500, e.Message);
            }
        }

Así es como estoy completando la clase RequestDto antes de llamar a la API web.

EDITAR 1:

RequestDto objrequestdto = GetConfigurations(configName);

private RequestDto GetConfigurations(string configName)
        {

            RequestDto requestdto = new RequestDto();

            /// Add configurations here.

            return requestdto;
        }

Debido a esto, obtengo registros duplicados en la API web.

Cualquier ayuda en esto apreciada!

1
XamDev 10 may. 2019 a las 12:47

3 respuestas

La mejor respuesta

Esto se debe a que está agregando los valores en el constructor.

2
Owen Pauling 10 may. 2019 a las 09:49

Está utilizando el constructor predeterminado para agregar los valores predeterminados, que también utiliza Serializer. Serializer llamará primero a su constructor predeterminado y luego completará los elementos del JSON.

Para evitar la duplicación, puede usar ISet<> en lugar de List<>.

public class RequestDto
{
    public RequestDto()
    {
        TypeNames = new HashSet<string>();
        TypeNames.Add(new string("Type1"));
        TypeNames.Add(new string("Type2"));
        TypeNames.Add(new string("Type3"));
    }

    public string CompanyName { get; set; }
    public string Version { get; set; }
    public ISet<string> TypeNames { get; set; }
}
0
cem 11 may. 2019 a las 00:15

Si alguien busca la respuesta, la resolví agregando el siguiente formato json en el archivo Startup.cs en el proyecto de API web.

services.AddMvc().AddJsonOptions(options =>
            {
                options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
                options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
                options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
            });

Esto ha resuelto el problema para mí.

0
XamDev 13 may. 2019 a las 09:49