Onde estou indo errado em chamar métodos da web ASMX a partir de jquery?
Pergunta
I têm um webmethod simples em uma aplicação asp.net 2,0 (utilizando as extensões não os 1,0 3,5 extensões Ajax). Eu estou tentando chamar o método de jQuery e quando eu fazê-lo como os inúmeros exemplos mostram na Internet e aqui no SO, eu recebo uma mensagem de erro de servidor interno devolvidos.
Aqui está o meu código atual:
[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 agora o 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);}
});
O webservice é decorado com o atributo [ScriptService]
também. Se eu comentar o contentType, alterar o tipo de dados de texto, e alterar os dados para ser uma string de consulta (name = value), eu recebo o XML retornado de forma adequada.
Para onde estou indo errado?
UPDATE: Eu estou usando jQuery v1.3.1 e testar tanto em IE6 e Firefox 3. Eu estou obtendo resultados consistentes.
Solução
Este foi um erro estúpido da minha parte. O problema foi resolvido. Enquanto eu incluído a referência ao Extensões AJAX, eu esqueci de reescrever o HttpHandler para os serviços ASMX para a classe ScriptHandlerFactory.
Adicionando este resolveu o problema.
Uma vez que eu tenho alguns e-mails perguntando sobre exemplos ou como eu corrigiu o problema, eu escrevi um post sobre como fazer esta sopa de nozes.
http: //randomactsofcoding.blogspot .com / 2009/03 / jquery-json-and-asmx-20-services.html
Outras dicas
Pois é. Você deve abandonar ASMX para WCF. Recomendação da própria Microsoft. Eu acho que não vai ajudá-lo em seu problema, mas você faria bem em considerar WCF ou pelo menos começar a olhar para essa tecnologia.
Eu tive o mesmo problema, mas foi fixas quando eu adicionei o seguinte para o arquivo de código
[System.Web.Script.Services.ScriptService]