Appeler ASMX depuis jQuery

J’essaie d’appeler une méthode ASMX à partir de jQuery sans succès. Voici mon code et je ne comprends pas ce qui me manque.

Fichier Something.js,

function setQuestion() { $.ajax({ type: "POST", data: "{}", dataType: "json", url: "http: //localhost/BoATransformation/Survey.asmx/GetSurvey", contentType: "application/json; charset=utf-8", success: onSuccess }); } function onSuccess(msg) { $("#questionCxt").append(msg); } 

Fichier SomethingElse.cs,

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class Survey : System.Web.Services.WebService { public Survey () { } [WebMethod] [ScriptMethod(UseHttpGet = true)] public ssortingng GetSurvey() { return "Question: Who is Snoopy?"; } } 

    Une chose qui se démarque est que vous avez UseHttpGet=true mais que dans votre code jQuery vous utilisez POST.

    Aussi, voici une page de test que j’ai créée en appelant une page ASMX.

     [WebMethod] public Catalog[] GetCatalog() { Catalog[] catalog = new Catalog[1]; Catalog cat = new Catalog(); cat.Author = "Jim"; cat.BookName ="His Book"; catalog.SetValue(cat, 0); return catalog; }  

    Vous devez vous assurer que vous spécifiez Json comme format de réponse si c’est ce que vous voulez et vous débarrasser de UseHttpGet pour des raisons de sécurité :

     [WebMethod] [ScriptMethod(ResponseFormat=ResponseFormat.Json)] public ssortingng GetSurvey() { return "Question: Who is Snoopy?"; } 

    Voici un exemple d’appel jQuery à une méthode de page sur un aspx, mais ce serait similaire à une page asmx.

     $.ajax( { type: "POST", url: "NDQA.aspx/ValidateRoleName", data: '{"roleName":"' + $('[id$=RoleNameTextBox]').val() + '"}', contentType: "application/json; charset=utf-8", dataType: "json", success: ValidateSuccess, error: ValidateError }); 

    Je suis tombé sur cette question et avait le même problème. Je l’ai résolu en ajoutant:

     [WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] 

    Sous votre atsortingbut de méthode Web, si vous souhaitez utiliser POST. c’est à dire:

     [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class Survey : System.Web.Services.WebService { public Survey () { } [WebMethod] [WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] [ScriptMethod(UseHttpGet = true)] public ssortingng GetSurvey() { return "Question: Who is Snoopy?"; } } 

    Je suggérerais également de supprimer UseHttpGet comme suggéré par Jim Scott.

    Vous pouvez append les éléments suivants à vos options et consulter objXMLHttpRequest pour afficher une réponse d’erreur plus détaillée.

     error: function(objXMLHttpRequest, textStatus, errorThrown) { debugger; } 

    Vous devez vous assurer que vous spécifiez Json comme format de réponse si c’est ce que vous voulez et vous débarrasser de UseHttpGet pour des raisons de sécurité:

    Si vous lisez cet article, vous constaterez qu’il est sûr d’utiliser UseHttpGet car ASP.NET dispose de fonctionnalités permettant de bloquer le vecteur d’attaque de script intersite.

    Il existe de nombreuses raisons valables d’utiliser GET.

    Il peut supprimer le paramètre data et changer POST en GET pour que l’appel fonctionne. En supposant que vous souhaitiez une réponse JSON, il serait également nécessaire d’append ResponseFormat = ResponseFormat.Json.

    Les étapes suivantes ont résolu mon problème, espérons que cela aidera quelqu’un,

    1. Pour permettre à ce service Web d’être appelé à partir d’un script, à l’aide d’ASP.NET AJAX, incluez la ligne suivante au-dessus de votre classe de service asmx, par exemple

      [System.Web.Script.Services.ScriptService] classe publique GetData: System.Web.Services.WebService {

    2. Ajouter des protocoles sous system.web dans web.config, veuillez cliquer sur le lien si vous ne pouvez pas voir la configuration.

    https://pastebin.com/CbhjsXZj

            

    Si vous essayez le navigateur Chrome, essayez Internet Explorer, cela a fonctionné pour moi et il s’agit également d’un navigateur Chrome, vous devez append une extension à fonctionne en chrome mais je ne connais pas le nom de l’extension