web-dev-qa-db-fra.com

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

Une chose qui se démarque est que vous avez UseHttpGet=true mais 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;
}

<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>
25
Jim Scott

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 des fonctionnalités de sécurité :

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

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

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

    });
2
CSharpAtl

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

Vous pouvez ajouter 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;               
}
1
Rick Hochstetler

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 possède des 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 de données et modifier POST en GET pour que l'appel fonctionne. En supposant que vous souhaitiez une réponse JSON, il serait également nécessaire d’ajouter ResponseFormat = ResponseFormat.Json.

1
Sean Smith

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. Ajoutez les protocoles sous system.web dans web.config, veuillez cliquer sur le lien si vous ne pouvez pas voir la configuration.

https://Pastebin.com/CbhjsXZj

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

1
balaji palamadai

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 ajouter une extension à fonctionne en chrome mais je ne connais pas le nom de l’extension.

0
Taha Karaca