Pergunta

Eu tenho um serviço web ASP.net que eu estou usando para uma aplicação web que retorna um dados JSON XML ou para mim, dependendo da chamada de função que eu. Isso tem funcionado bem até agora, mas eu correr em um problema. Eu quero criar um link "exportar" na minha página que irá baixar um arquivo JSON. O link está formatado de maneira muito simples:

<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>

Como você pode imaginar, isso deve exportar artigo 2. Até aí tudo bem, sim?

O problema é que desde que eu não estou pedindo especificamente que o tipo de conteúdo aceita é JSON, ASP.net absolutamente se recusa a enviar qualquer coisa, mas XML, que simplesmente não é apropriado para esta situação. O código é essencialmente o seguinte:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Item ExportItem(int itemId)
    {
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download

        return GetExportItem(itemId);
    }

Apesar da minha especificando o ResponseFormat como JSON, eu sempre chegar XML voltar a menos que eu solicitar este método via AJAX (usando o Google Web Toolkit, BTW):

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
    builder.setHeader("Content-type","application/json; charset=utf-8");
    builder.setHeader("Accepts","application/json");
    builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});

Isso é ótimo, mas AJAX não vai me dar uma caixa de diálogo de download. Existe alguma maneira de forçar ASP.net para me dar de volta JSON, independentemente de como os dados são solicitadas? Parece-me que não ter um comando manual para este comportamento é um descuido projeto bruto.


RESPOSTA RÁPIDA:

Primeiro, deixe-me dizer que eu acho resposta que do womp é provavelmente o melhor caminho a percorrer longo prazo (Converter para WCF), mas deostroll me levou à resposta que eu vou estar usando para o futuro imediato. Além disso, deve-se notar que este parece funcionar principalmente porque eu queria apenas um download, pode não funcionar tão bem em todas as situações. Em todo caso, aqui está o código que eu acabei usando para obter o resultado que eu queria:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void ExportItem(int itemId)
    {
        Item item = GetExportItem(itemId);            

        JavaScriptSerializer js = new JavaScriptSerializer();
        string str = js.Serialize(item);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
        Context.Response.AddHeader("content-length", str.Length.ToString());
        Context.Response.Flush();
        Context.Response.Write(str);
    }

Por favor, note que o tipo de retorno de vazio (o que significa que o seu WDSL será quase inútil para esta função). Retornando nada vai estragar a resposta que está sendo construído à mão.

Foi útil?

Solução

Aqui estão dois fóruns tópicos para sua referência:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982 aspx # 2338982

Eu não tenho nenhuma ideia clara. Eles dizem sobre concentrando-se em definir o tipo de conteúdo para application / json. Eu não tenho trabalhado com o WCF antes, mas eu acho que você pode fazer uso do objeto Response.

Definir o tipo de conteúdo no objeto de resposta. Fazer um response.write passando seus dados JSON como cordas e depois fazer um Response.End.

Outras dicas

ASP.NET Web Services são serviços Web baseados em SOAP. Eles sempre vão retornar XML. As bibliotecas Ajax veio e as coisas ScriptMethod foi introduzido, mas isso não muda o conceito subjacente do mesmo.

Há algumas coisas que você pode fazer.

WebMethods são limítrofe obsoleto com a introdução do WCF. Você pode considerar migrar seus serviços web para WCF , onde poderá tem muito controle maior sobre o formato de saída.

Se você não quiser fazer isso, você pode serializar manualmente o resultado de suas chamadas webservice em JSON, eo serviço irá dispor que em um cabeçalho SOAP. Você, então, precisa retirar o material SOAP.

Apenas pensei que eu ia jogar isso lá fora, uma vez que não foi mencionado anteriormente ... se você usar WebServices com ASP.NET 3.5, JSON é o formato padrão de retorno. Ele também vem junto com JSON serializador para que você possa parar de usar o JavaScriptSerializer.

Este artigo em conversas de blog de Rick Strahl sobre o strongly- conversão digitado você pode fazer entre as classes do lado do servidor e objetos JSON do cliente.

Eu completou recentemente um projeto usando este novo material JSON em .NET 3.5, e estou extremamente impressionado com o desempenho. Talvez vale a pena um olhar ...

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