Puis-je passer d'une interface basée objet d'un MVC 4 WebApi POST?
Je veux avoir une API en tant que tel:
public class RelayController : ApiController
{
//POST api/values
public void Post([FromBody]IDataRelayPackage package)
{
MessageQueue queue = new MessageQueue(".\\private$\\DataRelay");
queue.Send(package);
queue.Close();
}
}
J'obtiens une valeur null pour le "package" alors je me demandais ce qui pourrait mal se passer. Mes seules pensées sont que le défaut JSON
sérialiseur ne peut pas gérer cela, mais je suis pas clair comment le résoudre.
- Dans l'intérêt de temps, j'ai décidé de modifier mon WebAPI POST pour accepter une chaîne de caractères contenant le XML. J'ai l'intention de revenir sur ce sujet plus tard.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire assez facilement avec un modèle de liaison personnalisé. Voici ce qui a fonctionné pour moi. (À l'aide de l'API Web 2 et JSON.Net 6)
Le Web API contrôleur ressemble à ceci. (Note: il devrait également travailler régulièrement MVC actions -- j'ai fait quelque chose comme ça avant aussi bien.)
Je tiens également à noter que lors de la sérialisation JSON, vous devriez sérialiser avec le même réglage, et sérialiser comme une interface pour faire de l'Auto coup de pied dans et inclure le type d'indicateur. Quelque chose comme cela.
Vous essayez de deserialise à une interface. Le serialiser ne savez pas quel type d'instancier moins c'est dit.
Prendre un coup d'oeil à TypeNameHandling option L'affichage d'une collection de sous-classes
Ou chercher à créer un personnalisé JsonConverter. Jetez un oeil à cette question Comment mettre en œuvre personnalisée JsonConverter dans JSON.NET pour désérialiser une Liste de base des objets de la classe?
You are trying to deserialise to an interface
. Oh pinaise, mais bien expliqué. J'ai eu le même problème, cette ligne fait clairement comprendre. Merci.Json.NET (la valeur par défaut sérialiseur Json pour ASP.NET Web API) de gérer cette situation. Tout ce que vous devez faire est de changer le sérialiseur paramètres et définir TypeNameHandling à Tous (ou des Objets). Cela va ajouter un "$type"-json propriété à votre json, contenant le nom du type de votre instance. De l'autre côté, il va essayer de désérialiser à ce type de nouveau.
Nous avons utilisé cela pour nous-mêmes, de prendre une classe de base abstraite en tant que type.
Le sérialiseur a besoin d'un type qu'il peut construire, l'une avec un vide (par Défaut) du constructeur. Depuis une Interface ne peut pas être construit, la sérialisation échoue et vous obtenez une valeur null.
Deux options: