Dove sbaglio nel chiamare i metodi web ASMX da jquery?
Domanda
Ho un semplice metodo web su un'applicazione asp.net 2.0 (usando le estensioni 1.0 non le estensioni ajax 3.5). Sto tentando di chiamare il metodo da jQuery e quando lo faccio come mostrano gli innumerevoli esempi su Internet e qui su SO, viene restituito un messaggio di errore del server interno.
Ecco il mio codice attuale:
[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
public string Select(string login)
{
UserProfile profile = UserProfile.GetUserProfile(login);
return "{ FirstName: '" + profile.FirstName + "', " +
"LastName: '" + profile.LastName + "', " +
"EmailAddress: '" + profile.EmailAddress + "', " +
"PhoneNumber: '" + profile.PhoneNumber + "' }";
}
E ora il jquery:
$.ajax({
type: "POST",
url: "Services/ProfileService.asmx/Select",
dataType: "json",
data: "{'login':'DOMAIN%5CUSER1'}",
contentType: "application/json; charset=utf-8",
success: function(msg){ alert(msg); },
error: function(xhr){ alert(xhr.statusText);}
});
Il servizio web è decorato anche con l'attributo [ScriptService]
. Se commento contentType, cambio dataType in testo e cambio i dati in una stringa di query (nome = valore), viene restituito l'XML in modo appropriato.
Dove sbaglio?
UPDATE: Sto usando jQuery v1.3.1 e test in IE6 e Firefox 3. Sto ottenendo risultati coerenti.
Soluzione
Questo è stato uno stupido errore da parte mia. Il problema è stato risolto Mentre ho incluso il riferimento alle estensioni AJAX, ho dimenticato di riscrivere il httphandler per i servizi ASMX nella classe ScriptHandlerFactory.
L'aggiunta di questo ha risolto il problema.
Dato che ho ricevuto alcune e-mail in cui si chiedevano esempi o come ho risolto il problema, ho scritto un post sul blog su come fare questa zuppa alle noci.
http: //randomactsofcoding.blogspot .com / 2009/03 / jquery-jSON-e-ASMX-20-services.html
Altri suggerimenti
Yeap. Dovresti abbandonare ASMX per WCF. Raccomandazione degli stessi Microsoft. Immagino che non ti aiuterà nel tuo problema, ma faresti bene a prendere in considerazione WCF o almeno a iniziare a guardare quella tecnologia.
Ho avuto lo stesso problema ma è stato risolto quando ho aggiunto quanto segue al file di codice
[System.Web.Script.Services.ScriptService]