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" };
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top