Je pense avoir identifié la cause racine de l'apparition mystérieuse de "__type" !
Voici un exemple où vous pouvez recréer le problème.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class Test : System.Web.Services.WebService
{
public class Cat
{
public String HairType { get; set; }
public int MeowVolume { get; set; }
public String Name { get; set; }
}
[WebMethod]
public String MyMethodA(Cat cat)
{
return "return value does not matter";
}
[WebMethod]
public Cat MyMethodB(String someParam)
{
return new Cat() { HairType = "Court", MeowVolume = 13, Name = "Felix the Cat" };
}
}
Voici la partie clé !
Simplement parce que MyMethodA() existe dans ce même fichier .asmx et prend la classe Cat en paramètre.... le __type sera ajouté au JSON retourné lors de l'appel de l'autre méthode : MyMethodB().
Même s'ils sont des méthodes différentes !!
Ma théorie est la suivante :
- Lorsque vous écrivez des services web de cette manière, le code de Microsoft connecte automatiquement le comportement de sérialisation/désérialisation JSON pour vous car vous avez utilisé les attributs corrects, comme [WebMethod] et [ScriptService].
- Lorsque ce code magique automatique de Microsoft s'exécute, il trouve une méthode qui prend la classe Cat en paramètre.
- Il se dit... oh... ok.... bon puisque je vais recevoir un objet Cat depuis JSON.... donc... si je retourne un jour un objet Cat en JSON depuis n'importe quelle méthode de la classe de service web actuelle... je lui donnerai une propriété __type pour qu'il soit facile à identifier plus tard lors de la désérialisation en C#.
- Nyah-hahahaha...
Remarque Importante à Retenir
Vous pouvez éviter que la propriété __type n'apparaisse dans votre JSON généré en évitant de prendre la classe en question (Cat dans mon cas) en tant que paramètre pour l'un de vos WebMethods dans votre service web. Ainsi, dans le code ci-dessus, essayez simplement de modifier MyMethodA() pour supprimer le paramètre Cat. Cela évite la génération de la propriété __type.