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!
3 respuestas
Esto se debe a que está agregando los valores en el constructor.
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; }
}
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í.
Nuevas preguntas
c#
C # (pronunciado "see sharp") es un lenguaje de programación multi-paradigma de alto nivel, estáticamente tipado desarrollado por Microsoft. El código C # generalmente se dirige a la familia de herramientas y tiempos de ejecución .NET de Microsoft, que incluyen .NET Framework, .NET Core y Xamarin, entre otros. Use esta etiqueta para preguntas sobre el código escrito en las especificaciones formales de C # o C #.