Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将WebService响应转换为PDF?_C#_Asp.net_Xml_Web Services - Fatal编程技术网

C# 如何将WebService响应转换为PDF?

C# 如何将WebService响应转换为PDF?,c#,asp.net,xml,web-services,C#,Asp.net,Xml,Web Services,导言 我正在尝试将EuropassWebService与我目前正在开发的网站集成 此Web服务允许您通过XML或JSON文件获取PDF或Word CV 它们提供与WS和示例XML通信的信息,但您可以自己做,因为您尊重它们的模式 要确保xml正常,请使用远程上载服务,并在他们的网站上查看xml生成的简历 我使用的是REST服务,更具体地说是XML到PDF CV 我的怀疑 我的问题是,我可以与Web服务进行通信,并且我也得到了一个OK的响应(太好了!),但是当下载PDF时,它都是空白的 我在这里错过

导言

我正在尝试将EuropassWebService与我目前正在开发的网站集成

此Web服务允许您通过XML或JSON文件获取PDF或Word CV

它们提供与WS和示例XML通信的信息,但您可以自己做,因为您尊重它们的模式

要确保xml正常,请使用远程上载服务,并在他们的网站上查看xml生成的简历

我使用的是REST服务,更具体地说是XML到PDF CV

我的怀疑

我的问题是,我可以与Web服务进行通信,并且我也得到了一个OK的响应(太好了!),但是当下载PDF时,它都是空白的

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

要复制此内容,请复制下面的代码,并将其内容添加到xmlcontent路径中的文件中

代码

        //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();
                    }
                }
            }

您可以在服务器上提供文件路径

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

从webservice调用接收的响应正文包含PDF的原始字节

通过在数据库中运行这些字节,您将它们视为文本,然后尝试使用将这些“文本”转换回字节数组。我怀疑这些步骤正在破坏您的数据

您应该能够将PDF字节直接复制到您自己的:


什么是“响应”对象?在任何地方都看不到它的定义。我认为您在这里错过的是(从站点):“在一个名为europass xml的参数中。”您正在传递一个有效的xml,而不是在预期的容器中。这就是为什么他们使用名为europass xml的textarea将xml直接发布到他们的站点。此对象允许您向客户端发送HTTP响应数据,并包含有关该响应的信息。我正在使用ASP.NET4.5Framework@LocEngineer但是如果出了问题,我怎么能得到肯定的回答呢?干杯你发了一个正确的回复。但是当他们查询容器“europass xml”时,它是空的=>因此您会收到一个空的pdf。Hello@BMaximus,我使用的文件路径是获取xmlcontent,然后在POST请求中发送。你能说得更具体一点吗?Chearshello@LukeH那是一次难以置信的打击!非常感谢!:)
// 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();
    }
}