Como deixar uma saída JSON arquivo ASMX
Pergunta
Eu criei um arquivo ASMX com um código por trás do arquivo. É bom trabalho, mas é a saída XML.
No entanto, eu preciso dele para JSON de saída. A configuração ResponseFormat não parece trabalho. Meu código-behind é:
[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
[WebMethod]
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
public string[] UserDetails()
{
return new string[] { "abc", "def" };
}
}
Solução
A partir WebService retorna XML mesmo quando set ResponseFormat para JSON :
Certifique-se de que o pedido é um pedido POST, não um GET. Scott Guthrie tem uma post explicando por que .
Apesar de ser escrito especificamente para jQuery, isso também pode ser útil para você:
usando jQuery para consumir ASP.NET JSON web Services
Outras dicas
Para receber uma string JSON puro, sem que seja envolvida em uma XML, você tem que escrever a string JSON diretamente ao HttpResponse
e alterar o tipo de WebMethod
retorno à void
.
[System.Web.Script.Services.ScriptService]
public class WebServiceClass : System.Web.Services.WebService {
[WebMethod]
public void WebMethodName()
{
HttpContext.Current.Response.Write("{property: value}");
}
}
Esta é uma notícia provavelmente velho agora, mas a magia parece ser:
- [ScriptService] atributo na classe de serviço web
- [ScriptMethod (UseHttpGet = verdadeiro, ResponseFormat = ResponseFormat.Json)] no método
- Content-Type: application / json no pedido
Com essas peças no lugar, um pedido GET é bem sucedido.
Para um POST HTTP
- [ScriptMethod (UseHttpGet = falso, ResponseFormat = ResponseFormat.Json)] no método
e no lado do cliente (assumindo que o seu webmethod é chamado MethodName, e leva um único parâmetro chamado searchString):
$.ajax({
url: "MyWebService.asmx/MethodName",
type: "POST",
contentType: "application/json",
data: JSON.stringify({ searchString: q }),
success: function (response) {
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus + ": " + jqXHR.responseText);
}
});
A pegadinha rápida que eu aprendi da maneira mais difícil (basicamente passar 4 horas no Google), você pode usar PageMethods em seu arquivo ASPX para retornar JSON (com o marcador [ScriptMethod ()]) para um método estático, no entanto, se você decidir mudar seus métodos estáticos para um arquivo asmx, ele não pode ser um método estático.
Além disso, você tem de dizer o serviço web Content-Type: application / json para obter JSON volta da chamada (estou usando jQuery e 3 erros a evitar quando usando o artigo jQuery foi muito esclarecedor - a sua de o mesmo site mencionado em outra resposta aqui).
Você está chamando o serviço web a partir de script de cliente ou no lado do servidor?
Você pode encontrar enviando um cabeçalho tipo de conteúdo à vontade ajuda servidor, por exemplo,
'application / json; charset = utf-8'
No lado do cliente, eu usar a biblioteca do lado do cliente protótipo e não há um parâmetro contentType ao fazer uma chamada Ajax, onde você pode especificar isso. Eu acho que jQuery tem um método getJSON.
Alternativa: Use um manipulador genérico HTTP (.ashx) e usar sua biblioteca JSON favorito para serialize manualmente e anular o seu JSON.
Eu descobri que o controle completo sobre o tratamento de um pedido e gerando uma resposta bate qualquer coisa ofertas .NET outra coisa para simples, serviços RESTful Web.