una - servicio rest c# json
Determinar cuándo se envían pares clave/valor JSON no válidos en una solicitud.NET MVC (2)
bueno, puedes probar algo como
public ActionResult Save(object commingJson)
{
PersonModel person = new PersonModel();
try{
person.FName = commingJson.FName;
person.LName = commingJson.LName ;
}
catch(Exception)
{
//Binding Failed invalid json
}
int countInObject = GetAttrCount(commingJson);
int countInModel = GetAttrCount(person);
if(countInObject != countInModel )
{
//Json have more or less value then model
}
if(ModelState.IsValid) // returns true
// do things
return View(person)
}
public int GetAttrCount(obecjct countObject)
{
Type type = typeof(countObject);
int attributeCount = 0;
foreach(PropertyInfo property in type.GetProperties())
{
attributeCount += property.GetCustomAttributes(false).Length;
}
return attributeCount ;
}
Tengo un cliente con una aplicación MVC que acepta solicitudes JSON sin formato. El ModelBinder mapea los pares entrantes de clave / valor a las propiedades del Modelo de Controlador, no hay problema allí.
El problema es que quieren arrojar un error cuando envían un par clave / valor inválido, y por mi vida no puedo encontrar los datos entrantes sin procesar.
Por ejemplo, si tengo un modelo con una propiedad de cadena MName
pero en su solicitud JSON envían "MiddleName":"M"
, ModelBinder arrojará esta clave inválida y dejará la propiedad MName
blanco. Esto no arroja un error y ModelState.IsValid
devuelve true
.
Sé que podría lanzar un atributo [Required]
en la propiedad, pero tampoco está bien, ya que puede haber valores nulos para esa propiedad, y todavía no llega al problema de detectar pares de clave / valor que no funcionan t pertenece.
Esto no es una cuestión de sobre-publicación; No estoy tratando de evitar que un valor entrante se vincule al modelo. Intento detectar cuando un valor entrante simplemente no se correlaciona con nada en el modelo.
Como los valores vienen como application / json en el cuerpo de la solicitud, no estoy teniendo suerte ni siquiera para acceder, dejar de contar o enumerar los datos de solicitud sin procesar. Puedo extraer pares nombre / valor de ModelState.Keys
pero eso solo incluye los campos que se asignaron correctamente. Ninguna de estas claves está en la colección Request[]
.
Y sí, esto está en ASP.NET MVC 5, no en WebApi. ¿WebAPI maneja esto de manera diferente?
¿Algunas ideas?
Ejemplo:
application / json: {"FName": "Joe", "MName": "M", "LName": "Blow"}
public class PersonModel
{
public string FName { get; set; }
public string LName { get; set; }
}
public class PersonController() : Controller
{
public ActionResult Save(PersonModel person)
{
if(ModelState.IsValid) // returns true
// do things
return View(person)
}
}
Puede leer datos json que se enviaron en la solicitud de Request.InputStream
y deserializar a un objeto. A continuación, puede comparar los nombres de propiedad que se publicaron con los nombres de propiedad de su modelo
public ActionResult Save(PersonModel person)
{
// Get the models property names
var modelProperties = person.GetType().GetProperties().Select(x => x.Name);
// Read the InputStream
StreamReader reader = new StreamReader(Request.InputStream);
reader.BaseStream.Position = 0;
string jsonText = reader.ReadToEnd();
// Deserialize to object and read property names
JavaScriptSerializer serializer = new JavaScriptSerializer();
object jsonObject = serializer.DeserializeObject(jsonText);
IDictionary<string, object> dictionary = jsonObject as IDictionary<string, object>;
var jsonProperties = jsonObject.Keys;
// Get the json property names which do not match the model property names
List<string> invalidProperties = jsonProperties.Except(modelProperties, StringComparer.OrdinalIgnoreCase).ToList();
Si invalidProperties
contiene valores, entonces podría lanzar su error (y tal vez usar String.Join()
para incluir la lista de los nombres de propiedad no válidos y la lista de nombres de propiedad del modelo real en el mensaje de error que se devuelve al cliente).