2008-10-22 12 views
2

Je tente de publier sur un service de données ADO.NET, mais les paramètres semblent se perdre en cours de route.Réception du paramètre du corps de la demande dans le service de données WCF/ADO.NET

J'ai quelque chose comme:

[WebInvoke(Method="POST")] 
public int MyMethod(int foo, string bar) {...} 

et je fais un ajax-appel à l'aide prototype.js comme:

var args = {foo: 4, bar: "'test'"}; 
new Ajax.Requst(baseurl + 'MyMethod', 
    method: 'POST', 
    parameters: args, 
    onSuccess: jadda, 
    onFailure: jidda 
} 

Si je remplace "méthode: 'POST'" avec « méthode: 'GET' » et "WebInvoke (méthode =" pOST ")" avec "WEBGET" tout fonctionne mais maintenant (à l'aide post) tout ce que je reçois est:

Bad Request - erreur dans la syntaxe de la requête.

du service.

La seule correction (que je ne veux pas utiliser) est d'envoyer tous les paramètres dans l'URL même lorsque j'effectue un post. Toutes les idées sont les bienvenues.

Répondre

2

Les webservices WCF et ASMX ont tendance à être un peu sélectifs sur le corps de la requête, quand vous spécifiez args, la requête est généralement codée en foo = 4 & bar = test, vous devez spécifier le littéral javascript: -

new Ajax.Request(baseurl + 'MyMethod', { 
     method: 'POST', 
     postBody: '{"foo":4, "bar":"test"}', 
     encoding: "UTF-8", 
     contentType: "application/json;", 
     onSuccess: function(result) { 
      alert(result.responseJSON.d); 
     }, 
     onFailure: function() { 
      alert("Error"); 
     } 
    }); 
0

Si vous souhaitez utiliser POST, vous devez spécifier les paramètres à encapsuler dans la requête dans l'attribut WebInvoke, sauf si les paramètres contiennent un objet (par exemple, contrat de message). Cela est logique car il n'y a aucun moyen de sérialiser les paramètres sans être enveloppé dans json ou xml.

Unwrapped qui n'est pas XML en effet comme manquant élément racine

<foo>1</foo> 
<bar>abc</bar> 

Emballé, XML valide

<Request> 
    <foo>1</foo> 
    <bar>abc</bar> 
</Request> 

Cet exemple applique également aux JSON

0

Voulez-vous dire que je devrais envelopper la paramètres i le javascript comme

var args = {Request: {foo: 3, bar: "'test'"}} 

ou est-ce qu'il me manque quelque chose?

J'ai essayé d'ajouter:

à l'WebInvoke attribut
ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped 

mais sans résultat. J'ai essayé de mettre "Content-Type" (dans l'appel ajax de js POST) à "application/x-www-form-urlencoding" et "application/json; charset = utf-8" mais sans résultat.

Questions connexes