none
[RESOLVIDO] Como abrir um PDF no navegador consumindo um Restful service? RRS feed

  • Pergunta

  • Olá amigos, 

    Tenho um restful service onde tenho um método GET que abre em tela um relatório em PDF.

    Gostaria de fazer esse relatório abrir em um navegador diretamente.

    Abaixo o código:
    WebRequest req = WebRequest.Create(@"http://193.107.1.152:8080/DataSnap/Rest/TDSServerModule2/GerarPedido/36549");
    
                req.Method = "GET";
                req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("usuario:senha"));
    
                HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
                if (resp.StatusCode == HttpStatusCode.OK)
                {
                    using (Stream respStream = resp.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                        Console.Write(reader.ReadToEnd());
    
                        
                    }
                }
                else
                {
                    Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
                }
                Console.Read();
    Aguardo a ajuda!!

    Obrigado!!

    Cleverson Darsie


    terça-feira, 14 de abril de 2015 20:00

Respostas

  • André, 

    Alterei a forma de pegar a Stream do arquivo e consegui fazer aparecer no navegador, porém somente no Chrome, no IE a imagem não aparece.

    O IE que tenho instalado é o 8.

    O código que utilizei foi o seguinte:

                WebClient web = new WebClient();
                
                web.Credentials = new NetworkCredential("teste", "password");
                byte[] sendbyteArray = web.DownloadData((new Uri("http://193.107.1.152:8080/DataSnap/Rest/TDSServerModule2/GerarPedido/" + TextBox1.Text)));
    
                
                Response.ContentType = "application/pdf";
                Response.AddHeader("Content-Type", "application/pdf");
                Response.AddHeader("Content-Disposition", "inline");
                Response.BinaryWrite(sendbyteArray);
                Response.End(); 

    Vou verificar se pode ser problema de segurança no IE ou algo do tipo.

    Edit:
    Verifiquei e é sim um problema de compatibilidade do IE, testei nas versões 9 ou > e abriu na página normalmente.

    Tópico encerrado!

    Obrigado pela ajuda André!!


    Cleverson Darsie



    quarta-feira, 15 de abril de 2015 15:13

Todas as Respostas

  • Cleverson,

    Quando você fala navegador diferente é em uma janela diferente ou por exemplo, esse código só abre no chrome e não funciona no IE...

    Poderia enviar seu código do frontend (cshtml, aspx, html...)?


    Att. André de Mattos Ferraz

    terça-feira, 14 de abril de 2015 20:24
  • Olá André, 

    Então, não quero abrir numa janela diferente, a palavra é diretamente.

    Por exemplo, eu dou o número do pedido que eu quero num textbox e quando eu clicar em "gerar relatório", ele abre uma outra janela ou uma outra aba no navegador com o PDF criar no Rest service que possuo.

    Eu consigo utilizar normalmente se colocar o link do rest no navegador, mas coloquei como autenticação básica, então preciso fornecer as credenciais. Faço isso no próprio código C#, conforme visualizado acima, mas estou com dificuldade de abrir esse pdf em uma aba ou nova janela do navegador.

    Deve ser uma coisa simples, mas que estou apanhando.


    Cleverson Darsie

    quarta-feira, 15 de abril de 2015 11:18
  • Se for um formulário assim deve funcionar:

    <form target="_blank" action="<actionnorest>" method="post" >

    ...

    </form>


    Att. Andre de Mattos Ferraz

    quarta-feira, 15 de abril de 2015 12:13
  • André, 

    Não deve ter nenhum outro form ou página, o pdf deve simplesmente abrir em outra aba, sem codificação nenhuma.

    Assim como nesse link:
    http://www.sidarta.org.br/wp-content/uploads/2013/01/exemplo.pdf

    Quero exibir o relatório em tela apenas.


    Cleverson Darsie

    quarta-feira, 15 de abril de 2015 12:19
  • Me mostra como está seu frontend (html, cshtml, aspx).

    Att. Andre de Mattos Ferraz

    quarta-feira, 15 de abril de 2015 12:30
  • Meu front não tem nada demais, só um textbox para inserir o código do relatório e um botão de gerar relatório:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebService.Index" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
            <div>
                <asp:Button ID="Button1" runat="server" Text="Gerar relatório" />
            </div>
        </form>
    </body>
    </html>
    
    E no clique do botão está o código para acessar o rest e gerar o relatório:

    protected void Button1_Click(object sender, EventArgs e)
            {
                WebRequest request = WebRequest.Create(@"http://193.107.1.152:8080/DataSnap/Rest/TDSServerModule2/GerarPedido/36549");
    
                request.Method = "GET";
                request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("teste"));
                request.ContentType = "application/pdf";
    
                HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
    
                if (resp.StatusCode == HttpStatusCode.OK)
                {
                    using (Stream respStream = resp.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                        //Aqui deve ser feito algo para gerar e abrir o pdf em outra página    
                    }
                }
                else
                {
                    Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
                }
                Console.Read();
            }
    É somente isso mesmo!! Da forma que está eu consigo autenticar no rest, mas não sei como proceder com o pdf.


    Cleverson Darsie

    quarta-feira, 15 de abril de 2015 12:39
  • Vamos por partes,

    Você não tem um RESTFUL, vc tem um controle asp não mais que isso. Sugiro vc dar uma lida sobre RESTFUL e sobre páginas ASPX.

    No seu caso eu acho que isso resolve:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebService.Index" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server" target="_blank">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
            <div>
                <asp:Button ID="Button1" runat="server" Text="Gerar relatório" />
            </div>
        </form>
    </body>
    </html>


    Att. Andre de Mattos Ferraz

    quarta-feira, 15 de abril de 2015 13:03
  • Quando eu digo que tenho um Restful service é que ele está aberto em um local na rede, possuo um serviço com o método GET para consumir esse Rest.

    Consigo consumir esse rest se eu apenas informar o caminho dele no browser: "http://193.107.1.152:8080/DataSnap/Rest/TDSServerModule2/GerarPedido/" + TexBox1.Text

    Mas eu quero implementar isso em uma aplicação web que tenho. Essa página que te enviei é apenas um teste do que quero fazer, inserir o código do relatório e exibi-lo em tela.

    Isso que você me informou agora abre uma nova janela do browser, mas não adianta muito, pois não carrega o relatório que informei no TextBox.

    Quero que abra a janela e carregue em tela o PDF que estou consumindo do meu Rest.


    Cleverson Darsie

    quarta-feira, 15 de abril de 2015 13:40
  •  using (Stream respStream = resp.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                        //Aqui deve ser feito algo para gerar e abrir o pdf em outra página    
    Stream stream = reader.BaseStream;
     
                BinaryReader binaryReader = new BinaryReader(stream);
     
                byte[] sendbyteArray = binaryReader.ReadBytes(Convert.ToInt32(binaryReader.BaseStream.Length));
     
                Response.ContentType = "application/pdf";
                Response.AddHeader("Content-Type", "application/pdf");
                Response.AddHeader("Content-Disposition", "inline");
                Response.BinaryWrite(sendbyteArray);
                Response.End(); 
                    }

    Cara dá uma olhada pra ver se funciona.

    Abs!


    • Editado RZVieira quarta-feira, 15 de abril de 2015 14:36 nome variavel
    quarta-feira, 15 de abril de 2015 14:35
  • Essa solução eu já havia testado.

    Tenho uma outra aplicação que abre uma janela pra salvar o arquivo, troquei o "attachment" por "inline", assim como você fez acima, mas então tenho um outro problema:

    Na linha 

    byte[] sendbyteArray = binaryReader.ReadBytes(Convert.ToInt32(binaryReader.BaseStream.Length));

    é exibido a exceção: "Este fluxo não oferece suporte para operações de busca."

    Estranho isso... Assim como um arquivo local, deveria dar certo.


    Cleverson Darsie

    quarta-feira, 15 de abril de 2015 14:43
  • André, 

    Alterei a forma de pegar a Stream do arquivo e consegui fazer aparecer no navegador, porém somente no Chrome, no IE a imagem não aparece.

    O IE que tenho instalado é o 8.

    O código que utilizei foi o seguinte:

                WebClient web = new WebClient();
                
                web.Credentials = new NetworkCredential("teste", "password");
                byte[] sendbyteArray = web.DownloadData((new Uri("http://193.107.1.152:8080/DataSnap/Rest/TDSServerModule2/GerarPedido/" + TextBox1.Text)));
    
                
                Response.ContentType = "application/pdf";
                Response.AddHeader("Content-Type", "application/pdf");
                Response.AddHeader("Content-Disposition", "inline");
                Response.BinaryWrite(sendbyteArray);
                Response.End(); 

    Vou verificar se pode ser problema de segurança no IE ou algo do tipo.

    Edit:
    Verifiquei e é sim um problema de compatibilidade do IE, testei nas versões 9 ou > e abriu na página normalmente.

    Tópico encerrado!

    Obrigado pela ajuda André!!


    Cleverson Darsie



    quarta-feira, 15 de abril de 2015 15:13