2009-05-18 10 views
17

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

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); 
} 

SomethingElse.cs de fichier,

[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 string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
+3

Quelle erreur avez-vous eu? –

Répondre

25

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

Voici également 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; 
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
    $.ajax({ 
      type: "POST", 
      url: "default.asmx/GetCatalog", 
      cache: false, 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: handleHtml, 
      error: ajaxFailed 
     }); 
    }); 

    function handleHtml(data, status) { 
     for (var count in data.d) { 
      alert(data.d[count].Author); 
      alert(data.d[count].BookName); 
     } 
    } 

    function ajaxFailed(xmlRequest) { 
     alert(xmlRequest.status + ' \n\r ' + 
       xmlRequest.statusText + '\n\r' + 
       xmlRequest.responseText); 
    } 
</script> 
+0

Dans la mesure où je comprends cela, j'essaie de faire quelque chose de similaire moi-même. Pouvez-vous me dire, puisque l'attribut '[WebMethod]' semble être supporté dans les fichiers ASPX classiques, pourquoi un fichier ASMX est-il nécessaire? Merci. –

+0

Jonathan, si vous créez une méthode qui ne sera utilisée que pour la page spécifique que vous appelez webmethod, vous pouvez l'ajouter directement à la page. Toutefois, si vous voulez l'utiliser à partir de plusieurs pages, il est probablement préférable de créer un fichier asmx dédié pour qu'il puisse être réutilisé et n'a pas de relation directe avec certaines pages. –

+0

J'ai donc hébergé l'ASMX dans IIS sur un serveur, l'ASMX a une fonction 'DoTest' sur laquelle je peux cliquer et cela me mène à une autre page où je peux cliquer sur le bouton" Invoke "et afficher le XML. Cependant quand j'ai essayé l'appel JQuery ci-dessus, j'obtiens un '0 et une erreur 'comme l'erreur' ajaxFailed'. Une idée/ – Si8

1

Voici un exemple d'un appel jQuery à une méthode de page sur un ASPX, mais il 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 

    }); 
1

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

Vous pouvez ajouter ce qui suit à vos options et vérifier objXMLHttpRequest pour voir une réponse d'erreur plus détaillée.

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

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 en raison de security features:

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

Vous devez vous assurer que vous spécifiez Json comme le format de réponse si c'est ce que vous voulez et se débarrasser de UseHttpGet en raison des caractéristiques de sécurité:

Si vous lisez cet article, alors vous verrait qu'il est sûr d'utiliser UseHttpGet comme ASP.NET a des fonctionnalités pour bloquer le vecteur d'attaque de script intersite.

Il existe de nombreuses raisons valables d'utiliser GET.

Il peut supprimer le paramètre de données et modifier POST pour GET pour que l'appel fonctionne. En supposant que vous vouliez une réponse JSON, il serait également nécessaire d'ajouter ResponseFormat = ResponseFormat.Json.

2

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

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

En dessous de votre attribut de méthode Web, si vous souhaitez utiliser POST. à savoir:

[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 string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
0

Si vous essayez navigateur Chrome, essayez Internet Explorer, il a travaillé pour moi et aussi est sur le navigateur Chrome, vous devez ajouter l'extension aux travaux en chrome, mais je ne sais pas le nom de l'extension

1

Le Etapes suivantes résolu mon problème, espérons qu'il aide quelqu'un,

  1. Pour autoriser ce service Web à être appelé à partir du script, en utilisant ASP.AJAX NET, inclut la ligne suivante au-dessus de votre classe de service asmx par exemple

    [System.Web.Script.Services.ScriptService] public class GetData: System.Web.Services.WebService {

  2. Ajouter protocoles sous system.web dans web.config, s'il vous plaît cliquer sur le lien si vous n'êtes pas en mesure de voir la configuration

https://pastebin.com/CbhjsXZj

<system.web> 
<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
</webServices> 

Questions connexes