Usuário com melhor resposta
[RESOLVIDO] Como abrir um PDF no navegador consumindo um Restful service?

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
- Editado Cleverson Darsie quarta-feira, 15 de abril de 2015 15:49 Resolvido!
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
- Editado Cleverson Darsie quarta-feira, 15 de abril de 2015 15:48
- Marcado como Resposta Cleverson Darsie quarta-feira, 15 de abril de 2015 15:49
Todas as Respostas
-
-
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
-
-
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
-
-
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
-
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
-
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
-
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
-
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 linhabyte[] 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
-
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
- Editado Cleverson Darsie quarta-feira, 15 de abril de 2015 15:48
- Marcado como Resposta Cleverson Darsie quarta-feira, 15 de abril de 2015 15:49