2010-10-06 6 views
2

Ok, ceci est une de ces questions basiques, mais j'ai fait un googled et débogué maintenant pendant deux heures et l'erreur m'échappe.Appeler le service WCF avec jquery et les paramètres

Scénario simple: service WCF avec des méthodes avec des paramètres que j'aimerais appeler via jquery. Je peux appeler des méthodes sans params, mais avec params, l'appel ne parvient jamais à mon point d'arrêt dans .NET.

ServerCode:

[ServiceContract(Namespace = "http://www.myhost.de")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MyService 
{ 
    [OperationContract] 
    public int TestMeWithParam(int lastId) 
    { 
     return lastId; 
    } 

    [OperationContract] 
    public int TestMe() 
    { 
     return 5; 
    } 
} 

code Javascript

function BaseServiceCall(serviceName, dataInput, successCB, errorCB) { 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: BaseUrl + "Services/MyService.svc/" + serviceName, 
     data: dataInput, 
     dataType: "json", 
     timeout: 2000, 
     success: successCB, 
     error: errorCB 
    }); 
} 

function ServiceGetMessages(lastMessageId, successCB, errorCB) { 
    BaseServiceCall("TestMeWithParam", "{'lastId':'17'}", successCB, errorCB); 
    //BaseServiceCall("TestMe", "", successCB, errorCB); 
} 

Donc, si je l'appelle le service TestMe retourne 5. Il fonctionne. TestMeWithParam n'est jamais appelé.

Que se passe-t-il?

+0

Essayez de remplacer '" {'lastId': '17'} "' par '' {"lastId": 17} '', tout changement? –

+0

Non, cela ne fonctionne pas. – newtogit

+0

Que montre fiddler comme étant passé à la WCF? –

Répondre

0

Donc, maintenant cela fonctionne. Je ne suis pas très sûr pourquoi, puisque je n'ai pas beaucoup changé. Je crains un facteur était que mon délai d'attente était trop petit pour le débogage (mais même alors, il aurait dû travailler).

Donc, maintenant le code du serveur qui fonctionne pour moi (avec et sans params)

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MyService 
{ 
    [OperationContract] 
    public int TestMeWithParam(int lastId) 
    { 
     return lastId; 
    } 

    [OperationContract] 
    public int TestMe() 
    { 
     return 5; 
    } 
} 

Comme je l'ai lu quelque part ailleurs, pas WebInvoke est nécessaire à tous. Juste la norme ordinaire.

Code client:

function BaseServiceCall(serviceName, dataInput, successCB, errorCB) { 
$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: BaseUrl + "Services/MyService.svc/" + serviceName, 
    data: dataInput, 
    dataType: "json", 
    timeout: 200000, 
    success: successCB, 
    error: errorCB 
}); 
} 

ServiceGetMessages fonction (lastMessageId, successCB, errorCB) { BaseServiceCall ("TestMeWithParam", { "lastId": "+ lastMessageId + '"}', successCB, errorCB) // BaseServiceCall ("TestMe", "" "', successCB, errorCB); }

J'ai changé les guillemets comme suggéré par Mouhannad, même si je suis sûr que j'ai déjà essayé.

J'ai également essayé sans "lastId" qui n'a pas fonctionné.

J'ai eu cette expérience auparavant avec WCF: vous jouez et jouez, alors ça marche et vous ne savez pas pourquoi. :(

+0

Je suis content que je puisse vous aider. J'ai eu le même problème avec les citations moi-même récemment! – Mouhannad

+0

Si je n'efface pas le cache du navigateur, je lance parfois une ancienne version du fichier .js. – JBrooks

0

Je ne suis pas sûr, mais je serais intéressé à savoir si l'ajout de ce ci-dessous attribut OperationContract travaillerait:

[WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json) 

suis tombé sur ce lien ainsi: Creating a Webservice Proxy with jQuery

+0

Non, ne fonctionne pas. POST est la valeur par défaut. Pour activer GET, j'ai besoin d'ajouter l'attribut [WebGet]. – newtogit

+0

vous aviez type: "POST" là-bas, donc je supposais que vous étiez posté .... –

+0

Je suis en poste, mais POST est la valeur par défaut pour les services WCF AJAX. Seulement si vous voulez utiliser GET, vous devez ajouter l'attribut [WebGet]. – newtogit

0

d'abord vous devez vérifier que votre méthode renvoie des données au format JSON (ResponseFormat = WebMessageFormat.Json). L'utilisation de [WebInvoke (Method = "POST", ResponseFormat = WebMessageFormat.Json)] comme attribut supplémentaire de TestMeWithParam sera suffisante. Si vous définissez la même information dans le fichier de configuration, cela fonctionnera également.

Vous principal problème devrait être résolu avec l'appel suivant:

BaseServiceCall("TestMeWithParam", JSON.stringify(17), successCB, errorCB); 

ou

BaseServiceCall("TestMeWithParam", "17", successCB, errorCB); 

JSON.stringify (17) est égal à "17" (entiers ne sera pas changé au cours JSON encodage, mais seront des chaînes de cause).

Si le paramètre d'entrée est une classe, vous devez alors envoyer des données sérialisées JSON de l'objet JavaScript correspondant sans codage du nom de paramètre de la méthode WCF (sans 'lastId'). Les noms de paramètres seront utilisés uniquement si vous appelez le service Web ASMX au lieu de WFC. Voir mon this old answer pour comparer.

+0

Oui, ça revient au format JSON (je pourrais le confirmer, maintenant que ça marche). Mais même si ce n'était pas le point d'arrêt du serveur aurait dû être touché. Appeler sans nom de paramètre NE FONCTIONNE PAS. Je l'ai essayé. Avec le nom du paramètre, cela fonctionne. – newtogit

+0

@newtogit: Désolé, je ne suis pas sûr de vous avoir compris. L'appel 'BaseServiceCall (" TestMeWithParam "," 17 ", successCB, errorCB)' fonctionne-t-il ou non? Quel appel "sans nom de paramètre NE FONCTIONNE PAS" et qui fonctionne? – Oleg

+0

Fournir uniquement la valeur (et non le nom du paramètre) ne fonctionne pas pour moi. Si je fournis les deux (comme dans la réponse que j'ai posté moi-même), cela fonctionne. – newtogit

3

J'ai eu des problèmes similaires lorsque j'ai essayé d'utiliser jquery avec wcf! essayer de changer cela:

"{'lastId':'17'}" to '{"lastId":"17"}' 
//i know you tried something similar but try putting the brackets around the number as well 

laissez-moi savoir si cela ne fonctionne pas, je vais modifier mon message à passer par la solution avec vous.

p.s. vous devriez aussi essayer la suggestion de @ Bryce!

[WebInvoke(Method = "POST", 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json)] 
//note the response and request format 
+0

J'ai changé la citation comme vous l'avez suggéré. Au moins, cela semble avoir fait partie de la solution. Cela fonctionne également sans les trucs WebInvoke. – newtogit

Questions connexes