J’ai un contrat d’opération qui accepte un object complexe et j’appelle l’opération via jQuery. Comment puis-je passer dans un object de type complexe comme ça en utilisant jQuery. Ci-dessous la signature de l’opération:
public Resolution CreateNewResolution(Resolution NewResolution);
Je dois transmettre un object de résolution sur le client, mais je ne sais pas comment utiliser jQuery. De l’aide?
Je vous remercie
Voir le post de Denny pour un début, bien que je ne sois pas d’accord avec son utilisation de GET et en passant JSON dans la chaîne de requête pour les parameters complexes. Cela semble vraiment faux.
Le paramètre que vous utilisez pour les data
est la représentation JSON de votre type de résolution. Par exemple, supposons que le type et l’opération soient définis comme suit côté serveur:
[DataContract( Namespace = "urn:brandon.michael.hunter/ws/2010/01", Name = "Resolution" )] public class Resolution { [DataMember( IsRequired = true, Name = "Name" )] public ssortingng Name { get; set; } [DataMember( IsRequired = true, Name = "Rank" )] public int Rank { get; set; } [DataMember( IsRequired = true, Name = "SerialNumber" )] public int SerialNumber { get; set; } [DataMember( IsRequired = false, Name = "Id" )] public int Id { get; set; } } [OperationContract] [WebInvoke(Method = "PUT", RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "new")] public Resolution CreateNewResolution(Resolution r) { // your logic here r.Id = System.Guid.NewGuid(); return r; }
Ensuite, en Javascript, le code que vous utilisez peut ressembler à ceci:
var resolution = {r: { Name : "Fred", Rank : 2, SerialNumber : 17268 }}; // convert object to JSON ssortingng (See http://jollytoad.googlepages.com/json.js) var objectAsJson = $.toJSON(resolution); // result is a ssortingng: '{"Name":"Fred","Rank":"2","SerialNumber":"17268"}' $.ajax({ type : "PUT", // must match Method in WebInvoke contentType : "application/json", url : "Service.svc/new", // must match UriTemplate in WebInvoke data : objectAsJson, dataFilter : function (data, type) { // convert from "\/Date(nnnn)\/" to "new Date(nnnn)" return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1'); }, processData : false, // do not convert outbound data to ssortingng (already done) success : function(msg){ ... }, error : function(xhr, textStatus, errorThrown){ ... } });
Remarques:
processData=true
, la chaîne résultante envoyée au service est au format chaîne de requête, pas au format JSON. Pas ce que je veux pour passer des objects complexes. Alors je l’ai mis à faux. L’utilisation de true conviendrait pour les requêtes plus simples non JSON pour lesquelles vous exécutez WebGet et où tous les parameters sont dans la chaîne de requête. msg
transmis au rappel de réussite contient le JSON renvoyé. Consultez le blog de Gil Fink concernant la combinaison des services de données WCF, JSONP et jQuery
Au cours de la session de Mike Flasko à MIX11, il a montré comment créer un service de données WCF prenant en charge JSONP avec un atsortingbut JSONPSupportBehavior disponible au téléchargement depuis la galerie de codes MSDN (et censé faire partie de l’espace de noms Microsoft.Data.Services.Extensions). Dans cet article, je vais vous montrer un exemple simple qui utilise l’atsortingbut et jQuery afin de faire un appel interdomaine JSONP pour un service de données WCF.
Mise en place de l’environnement
J’ai d’abord créé deux applications Web ASP.NET différentes. La première application comprend la page d’appel et la seconde comprend le service de données WCF. Ensuite, j’ai créé dans la deuxième application Web un modèle Entity Framework et le service de données WCF à partir de ce modèle. J’ai également ajouté la classe JSONPSupportBehavior.cs qui existe dans le lien fourni précédemment. La classe inclut l’implémentation de JSONPSupportBehavior qui implémente l’interface WCF IDispatchMessageInspector. En outre, il inclut le JSONPSupportBehaviorAtsortingbute que j’utilise dans mon code. Le code est simple et ressemble à:
[JSONPSupportBehavior] public class SchoolDataService : DataService { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } }
Faire l’appel JSONP
Dans la deuxième application Web, j’ai créé un formulaire Web contenant l’exemple d’appel JSONP. Voici le code qui effectue l’appel:
JSONP Call
Permet d’explorer le code du formulaire Web: Au début, j’utilise Microsoft CDN afin de récupérer la bibliothèque jQuery. Ensuite, j’ai créé un élément de sortie HTML5 afin de lui append le résultat de l’appel. Dans le script principal, j’utilise la fonction getJSON de jQuery, qui appelle le service de données WCF. Notez que pour obtenir une réponse JSON du service de données WCF, vous devez utiliser le paramètre chaîne de requête $ format = json. Après avoir récupéré les données, je parcours et crée un élément div pour chaque titre de cours récupéré. Cela se fait dans la fonction success que j’ai câblée dans l’appel de la fonction getJSON. Voici le résultat de l’exécution du code:
Résumé
Dans le post, j’ai fourni un exemple simple de création d’un appel JSONP vers un service de données WCF à l’aide de jQuery. Ce type de solution peut vous aider à utiliser les services de données WCF existant dans d’autres domaines de votre côté client. Dans un article postérieur, je montrerai le même exemple en utilisant la nouvelle bibliothèque datajs