È possibile farlo abbastanza facilmente con un raccoglitore modello personalizzato. Ecco cosa ha funzionato per me. (Utilizzo di Web API 2 e JSON.Net 6)
public class JsonPolyModelBinder : IModelBinder
{
readonly JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var content = actionContext.Request.Content;
string json = content.ReadAsStringAsync().Result;
var obj = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
bindingContext.Model = obj;
return true;
}
}
Il controller API Web si presenta così. (Nota: dovrebbe funzionare anche per le azioni regolari MVC - Ho fatto qualcosa di simile per loro prima pure.)
public class TestController : ApiController
{
// POST api/test
public void Post([ModelBinder(typeof(JsonPolyModelBinder))]ICommand command)
{
...
}
}
Vorrei anche sottolineare che quando si serializza il JSON, si dovrebbe serializzare con il stessa impostazione, e serializzarlo come un'interfaccia per attivare l'Auto kick e includere il suggerimento sul tipo. Qualcosa come questo.
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
string json = JsonConvert.SerializeObject(command, typeof(ICommand), settings);
fonte
2014-03-09 06:36:56
Nell'interesse del tempo, ho deciso di modificare il mio POST WebAPI per accettare una stringa contenente XML. Ho intenzione di tornare su questo più tardi. –