2012-09-29 1 views
2

Mon WebMethod ressemble à ceci:Pourquoi ne puis-je pas utiliser GET pour envoyer des paramètres à WebMethod?

[WebMethod] 
[ScriptMethod(ResponseFormat=ResponseFormat.Json, UseHttpGet=true)] 
public List<Person> HelloWorld(string hello) 
{ 
    List<Person> persons = new List<Person> 
    { 
     new Person("Sarfaraz", DateTime.Now), 
     new Person("Nawaz", DateTime.Now), 
     new Person("Manas", DateTime.Now) 
    }; 
    return persons; 
} 

Et je suis en train d'appeler cette méthode en utilisant jQuery:

var params={hello:"sarfaraz"}; //params to be passed to the WebMethod 
$.ajax 
({ 
    type: "GET", //have to use GET method 
    cache: false, 
    data: JSON.stringify(params), 
    contentType: "application/json; charset=utf-8", 
    dataType: 'json', 
    url: "http://localhost:51519/CommentProviderService.asmx/HelloWorld", 
    processData: true, 
    success: onSuccess, 
    error: onError  //it gets called! 
}); 

Mais il ne fonctionne pas. Au lieu d'appeler onSuccess rappel, il appelle onError où j'utilise alert comme:

alert(response.status + " | " + response.statusText + " | " + response.responseText + " | " + response.responseXML); 

qui imprime ceci:

500 | Erreur interne du serveur | {"Message": "Appel de service Web non valide, valeur manquante pour le paramètre: \ u0027hello \ u0027." "StackTrace": » à System.Web.Script.Services.WebServiceMethodData.CallMethod (cible de l'objet , IDictionary 2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary 2 paramètres) \ r \ n à System.Web.Script.Services.RestHandler.InvokeMethod (HttpContext contexte, WebServiceMethodData methodData, IDictionary`2 rawParams) \ r \ n à System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContext contexte, WebServiceMethodData methodData) », "ExceptionType": "System.InvalidOperationException"} | undefined

Je ne comprends pas pourquoi j'obtiens cette erreur.

Si je change l'appel jQuery pour utiliser la méthode POST et créer UseHttpGet=false, alors cela fonctionne très bien. Mais je veux que cela fonctionne avec GET. Qu'est-ce qui doit être réparé?

+0

essayez .asmx/HelloWorld?bonjour = sarfaraz – sri

Répondre

1

HTTP GET s'attend à ce que les paramètres soient tous codés dans l'URL.

Le problème est que vous faites un JSON.stringify sur votre charge utile. jQuery.ajax est vraiment à la recherche d'un dictionnaire simple qu'il peut transformer en une série de paramètres Query String.

Donc, si vous avez un objet comme celui-ci:

{ name: "value" } 

jQuery ajoutera à la fin de votre URL comme ceci:

?name=value 

Utilisez Firebug, outils de développement Chrome ou IE Developer outils pour inspecter l'URL sortante et je soupçonne que vous verrez qu'il est dans un format que ASP.Net ne peut pas traduire.

+0

Maintenant, j'ai essayé avec '{hello:" sarfaraz "}', et j'obtiens cette erreur: '500 | Erreur interne du serveur | {"Message": "primitive JSON invalide: sarfaraz.", "StackTrace": "à System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() ....' – Nawaz

+0

@Nawaz - Essayez de modifier votre paramètre de données pour qu'il ressemble this: 'data: {" hello ":" sarfaraz "}' – Josh

+0

Encore la même erreur.' "Primitive JSON invalide: sarfaraz [...]' – Nawaz

0

Pour faire une demande .ajax $ GET, vous devez définir vos données params="hello=sarfaraz"

Donc, l'extrait de code complet peut être simplement

var params="hello=sarfaraz"; //params to be passed to the WebMethod 
$.ajax 
({ 
    type: "GET", //have to use GET method 
    cache: false, 
    data: params, 
    dataType: 'json', 
    url: "http://localhost:51519/CommentProviderService.asmx/HelloWorld", 
    success: onSuccess, 
    error: onError //it gets called! 
}); 

Hope that helps!

Questions connexes