2015-04-02 114 views
2

简介如何将WebService响应转换为PDF?

我正在尝试将Europass Webservice与我目前正在开发的网站进行集成。

此WebService允许您通过XML或JSON文件获取PDF或Word简历。

他们提供信息与他们的WS和样本XML (here)沟通,但你可以自己做,因为你尊重他们的模式。

为了确保xml可以使用远程上传服务,并在他们的网站上查看来自您的XML的简历。

我使用REST服务,更具体的XML PDF CV

MY析疑

我的问题是,我可以与Web服务comunicate,我也得到一个OK应答(大!),但是当下载PDF时,它全部是空白的。

我在这里错过了什么?你们能指导我吗?

要重现此操作,请复制下面的代码,并将此xml的内容添加到xmlcontent路径中的文件中。

CODE

 //POST 
     string xmlContent = File.ReadAllText("D:\\Documents\\CV.xml"); 
     string URL = "https://europass.cedefop.europa.eu/rest/v1/document/to/pdf-cv"; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.Method = "POST"; 
     request.ContentType = "application/xml"; 
     using (Stream webStream = request.GetRequestStream()) 
     using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.UTF8)) 
     { 
      requestWriter.Write(xmlContent); 
     } 

     //RESPONSE 
     try 
     { 
      WebResponse webResponse = request.GetResponse(); 
      using (Stream webStream = webResponse.GetResponseStream()) 
      { 
       if (webStream != null) 
       { 
        using (StreamReader responseReader = new StreamReader(webStream)) 
        { 
         string response = responseReader.ReadToEnd(); 
         byte[] byteResponse = Encoding.UTF8.GetBytes (response); 
         Response.Clear(); 
         Response.Buffer = true; 
         Response.ContentType = "application/pdf"; 
         Response.AddHeader("content-disposition", "attachment;filename=test.pdf"); // Save file   
         Response.AddHeader("Content-Length", byteResponse.Length.ToString()); 
         Response.Charset = ""; 
         Response.Cache.SetCacheability(HttpCacheability.NoCache); 
         Response.BinaryWrite(byteResponse); 
         Response.End(); 
        } 
       } 
      } 
+0

什么是“响应”对象?没有看到它在任何地方定义。 – JunaidKirkire 2015-04-02 12:20:51

+0

我想你在这里错过的是这个(来自网站):“在一个名为europass-xml的参数中。” 您正在传递一个有效的XML,但不在预期的容器中。这就是为什么他们使用名为europass-xml的textarea将xml直接发布到他们的网站。 – LocEngineer 2015-04-02 12:28:37

+0

Hello @JunaidKirkire,响应对象与页面对象相关联。此对象允许您将HTTP响应数据发送到客户端,并包含有关该响应的信息。 [链接](https://msdn.microsoft.com/en-us/library/system.web.ui.page.response%28v=vs.110%29.aspx)。我正在使用ASP.NET 4.5 Framework – Nelssen 2015-04-02 12:33:05

回答

3

您收到来自Web服务调用包含了PDF的原始字节的响应体的文件路径。

通过运行这些字节通过StreamReader你对待它们就好像它们是文本,然后试图使用GetBytes将该“文本”转换回字节数组。我怀疑这些步骤正在破坏你的数据。

你应该能够在PDF字节直接复制到自己的output stream

// note: this code is completely untested, i don't even know whether it compiles 
using (var webResponse = request.GetResponse()) 
using (var webStream = webResponse.GetResponseStream()) 
{ 
    if (webStream != null) 
    { 
     Response.Clear(); 
     Response.Buffer = true; 
     Response.ContentType = "application/pdf"; 
     Response.AddHeader("Content-Disposition", "attachment; filename=\"test.pdf\""); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     webStream.CopyTo(Response.OutputStream); 
     Response.Flush(); 
     Response.End(); 
    } 
} 
+0

你好@LukeH,这是一个令人难以置信的罢工!非常感谢你! :) – Nelssen 2015-04-02 13:23:12

0

您提供服务器

WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf"; 
return File.OpenRead(downloadFilePath); 
+0

你好@BMaximus,我使用的文件路径是获取xmlcontent,然后在POST请求中发送。你能更具体吗?干杯 – Nelssen 2015-04-02 13:10:09