2009-05-18 15 views
17

Sto provando a chiamare un metodo ASMX da jQuery senza successo. Di seguito è riportato il mio codice e non capisco cosa mi manca.Chiamare ASMX da jQuery

file 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 file,

[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

Che errore hai ottenuto? –

risposta

25

Una cosa che spicca è che devi UseHttpGet=true ma nel codice jQuery che si sta utilizzando POST.

Anche qui è una pagina di prova che ho creato chiamando una pagina 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

Nella misura in cui lo capisco, sto provando a fare qualcosa di simile. Puoi dirmi, dal momento che l'attributo '[WebMethod]' sembra essere supportato nei normali file ASPX, perché è necessario un file ASMX? Grazie. –

+0

Jonathan, se si sta creando un metodo che verrà utilizzato solo per la pagina specifica da cui si chiama il metodo web, è possibile aggiungerlo alla pagina direttamente. Comunque se vuoi usarlo da più pagine probabilmente è meglio creare un asmx dedicato in modo che possa essere riutilizzato e non abbia una relazione diretta con qualche pagina. –

+0

Così ho ospitato ASMX in IIS in un server, ASMX ha una funzione 'DoTest' su cui posso cliccare e mi porta in un'altra pagina dove posso cliccare sul pulsante" Richiama "e visualizza l'XML. Tuttavia, quando ho provato quanto sopra con la chiamata JQuery, ottengo un '0 e errore' come l'errore' ajaxFailed'. Qualche idea/ – Si8

1

Ecco un esempio di una chiamata a un metodo jQuery pagina su un aspx, ma sarebbe simile a una pagina 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

Vorrei anche suggerire di rimuovere UseHttpGet come suggerito da Jim Scott.

È possibile aggiungere quanto segue alle opzioni e controllare objXMLHttpRequest per visualizzare una risposta all'errore più dettagliata.

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

È necessario assicurarsi di specificare JSON come formato di risposta, se questo è quello che vuoi e sbarazzarsi di UseHttpGet causa security features:

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

È necessario assicurarsi di specificare Json come il formato di risposta se questo è quello che vuoi e sbarazzarsi di UseHttpGet a causa di funzioni di sicurezza:

Se hai letto quell'articolo allora tu vedrebbe che è sicuro utilizzare UseHttpGet come ASP.NET ha funzionalità per bloccare il vettore di attacco cross site scripting.

Ci sono molti validi motivi per utilizzare GET.

È possibile rimuovere i parametri dei dati e modificare POST in GET per far funzionare la chiamata. Supponendo che si desideri una risposta JSON, sarebbe necessario aggiungere ResponseFormat = ResponseFormat.Json.

2

Mi sono imbattuto in questa domanda e ho avuto lo stesso problema. Ho risolto con l'aggiunta di:

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

Sotto l'attributo metodo Web, se si desidera utilizzare POST. vale a 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?"; 
    } 
} 
0

Se si tenta il browser Chrome, provare Internet Explorer ha funzionato per me ed anche si tratta di browser Chrome è necessario aggiungere l'estensione alle opere in Chrome, ma io non so il nome di estensione

1

Il seguenti passaggi risolto il mio problema, spero che aiuta qualcuno,

  1. per consentire a questo servizio Web per essere chiamato da uno script, utilizzando ASP.NET AJAX, includere la seguente riga sopra la classe di servizio ASMX per esempio

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

  2. Aggiungi protocolli sotto system.web nel web.config, clicca sul link se non si è in grado di visualizzare la configurazione

https://pastebin.com/CbhjsXZj

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