L’appel ajax JQuery à httpget webmethod (c #) ne fonctionne pas

J’essaie d’obtenir un ajax pour accéder à une méthode Web dans le code derrière. Le problème est que je reçois toujours l’erreur “Parserror” de la méthode jQuery onfail .

Si je modifie l’option GET en POST, tout fonctionne correctement. S’il vous plaît voir mon code ci-dessous.

Ajax Call

  var id = "li1234"; function AjaxGet() { $.ajax({ type: "GET", url: "webmethods.aspx/AjaxGet", data: "{ 'id' : '" + id + "'}", contentType: "application/json; charset=utf-8", dataType: "json", async: false, success: function(msg) { alert("success"); }, error: function(msg, text) { alert(text); } }); }  

Code derrière

 [System.Web.Services.WebMethod] [System.Web.Script.Services.ScriptMethod(UseHttpGet = true, ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)] public static ssortingng AjaxGet(ssortingng id) { return id; } 

Web.config

       

L’URL utilisée

…….. / webmethods.aspx / AjaxGet? {% 20% 27% 27% 20:% 20% 27li1234% 27}

Dans le cadre de la réponse, il renvoie le code HTML pour les méthodes Web de la page.

Toute aide est la bienvenue.

Avant tout, je peux dire que vous ne choisissez pas le moyen le plus simple. ScriptMethods est facile à utiliser avec ASP.NET ScriptManager et non avec jQuery. Je vous recommanderai de mieux utiliser les services HTTP WCF compatibles JSON (mieux que RESTfull Service) au lieu du service Web ASMX que vous essayez d’utiliser maintenant. Néanmoins, vous pouvez utiliser votre code sans utiliser les technologies Microsoft côté client.

Tout d’abord, vérifiez côté serveur.

  1. Renommez webmethods.aspx en webmethods.asmx.
  2. Vérifiez que vous avez placé Inside of \ et qu’un httpHandlers pour l’extension asmx (ScriptHandlerFactory) existe également dans la configuration:

                 
  3. Vérifiez que l’atsortingbut [ScriptService] ([System.Web.Script.Services.ScriptService] si vous aimez les noms complets) défini pour votre classe héritée de System.Web.Services.WebService.

Maintenant, vous pouvez tester le service. Ouvrez dans votre URL de navigateur Web telle que http: //localhost/webmethods.asmx/AjaxGet? Id = li1234 Si vous recevez quelque chose comme:

li1234

Vous pouvez être sûr que votre service fonctionne bien.

Remarque: Indépend sur “ResponseFormat = System.Web.Script.Services.ResponseFormat.Json” atsortingbuer la réponse de service avec des réponses XML si “Content-Type: application / json;” n’est pas défini dans la demande.

Maintenant, nous allons réparer le code client. J’espère que les commentaires que j’ai placés dans le code suivant expliquent tout.

Encore une petite remarque. Dans la dernière partie du code, j’appelle une autre méthode Web «complexe»:

 [WebMethod] [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public OutputData AjaxGetMore (InputData input) { return new OutputData () { id = input.id, message = "it's work!", myInt = input.myInt+1 }; } 

 public class OutputData { public ssortingng id { get; set; } public ssortingng message { get; set; } public int myInt { get; set; } } public class InputData { public ssortingng id { get; set; } public int myInt { get; set; } } 

Maintenant, seul le code JavaScript qui utilise le plugin JSON à certains endroits, qui pourrait être remplacé par le json2.js de Crockford, si quelqu’un le préfère.

 var id = "li1234"; // version 1 - works var idAsJson = '"' + id + '"'; // ssortingng serializes in JSON format $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet?id=" + idAsJson, contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 ssortingng properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 2 with respect of JSON plugin $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet?id=" + $.toJSON(id), contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 ssortingng properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 3 where jQuery will construct URL for us $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 ssortingng properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 4. We set "Content-Type: application/json" about our data, but we use no // not 'dataType: "json"' parameter. Then we have "Accept: */*" in the request // instead of "Accept: application/json, text/javascript, */*" before. // Everithing work OK like before. $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 ssortingng properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 5. If we don't place "Content-Type: application/json" in our reqest we // receive back XML (!!!) response with "HTTP/1.1 200 OK" header and // "Content-Type: text/xml; charset=utf-8" which will be placed. // How one can read in // http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx), // ASP.NET AJAX will not make JSON serialized of response data for // security reasons. $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, dataType: "json", //contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function (res, status, ex) { // the code here will be works because of error in parsing server response if (res.status !== 200) { // if not OK // we receive exception in the next line, be var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } else { alert("status=" + status + "\nex=" + ex + "\nres.status=" + res.status + "\nres.statusText=" + res.statusText + "\nres.responseText=" + res.responseText); } } }); // version 6. Send more komplex data to/from the service var myData = { id: "li1234", myInt: 100} $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGetMore", data: {input:$.toJSON(myData)}, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { // var msg = {__type: "Testportal.OutputData", id: "li1234", message: "it's work!", myInt:101} alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 ssortingng properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); 

Je suis venu ici pour chercher la réponse … Pour les autres, voici la réponse.

Pour des raisons de sécurité, les méthodes de page ASP.Net AJAX ne prennent en charge que les requêtes POST.

(De https://stackoverflow.com/a/2397521 )

 //... data: { "id" : id }, //... 

Les données sont un object, pas une chaîne qui ressemble à un object.

Si vous utilisez une chaîne, il doit s’agir d’une chaîne de requête d’URL correctement formatée, comme suit:

 //... data: "id=" + encodeURIComponent(id) + "&otherstuff=" + encodeURIComponent(data), //... 

Vous pouvez également vérifier http://www.json.org/js.html JSON.ssortingngify où il accepte un object json comme paramètre et renvoie une chaîne.

Pour ceux qui utilisent VB, décorez votre méthode comme ceci: