ASP.Net Web API - 显示HTML和下载文件

时间:2016-07-13 11:42:20

标签: asp.net http asp.net-web-api pdf-generation

在我们的AngularJS / ASP.Net WebAPI应用程序中,我们需要在单击按钮时生成PDF文件。该按钮会将用户重定向到浏览器页面上的以下网址:

xyz.com/api/getpdf?Token=f3Ttkwf5XyvvZwcOZpEz

getpdf是一个在发生错误时返回PDF文件或HTML错误代码的API。

问题是PDF最多可能需要30秒才能生成。在发送文件之前,如何在页面上显示一些HTML(通知用户等待)? HTML也应该在同一个API调用中返回。我已经读过,可以在一个请求上多个响应。但是我该怎么做呢?

这是控制器中用于返回PDF的简化代码:

[HttpGet]
public HttpResponseMessage GetPDF(string Token)
{
    HttpResponseMessage resp = null;
    try
    {         
        // Generate PDF
        Byte[] lPDF = GetPDF(Token);

        // Return PDF in response
        resp = Request.CreateResponse(HttpStatusCode.OK);
        resp.Content = new ByteArrayContent(lPDF);
        resp.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("inline");
        resp.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
        resp.Content.Headers.ContentDisposition.FileName = "PDF-File.pdf";
        resp.Content.Headers.ContentLength = lPDF.Length;

        return resp;
    }
    catch (Exception ex)
    {
        Toolkit.LogError("GetPDF", ex);
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

2 个答案:

答案 0 :(得分:0)

您可以在上一页创建叠加层。

例如,您有一个按钮可以调用您的控制器的方法,点击此按钮会显示您的叠加层,并显示消息'正在加载'。

生成文档后,页面将被重定向,叠加层将消失。

使用JQuery的示例



$("#generate").click(function(){
  $(".overlay").show();
  setTimeout(function(){window.location.href="http://stackoverflow.com"},2000);
});

.overlay{
display:none;
position:fixed;
top:0;
left:0;
background-color:rgba(0,0,0,0.5);
width:100%;
height:100%;
color:white;
text-align:center;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="overlay">Loading...</div>
<button id="generate">Generate</button>
&#13;
&#13;
&#13;

这里的setTimeout方法仅用于模拟响应时间。

答案 1 :(得分:0)

如果我理解正确,您可以分两步生成pdf文件。 第一步是要求Web服务器生成pdf文件。 (POST请求) 第二步是询问Web服务器是否已生成pdf文件。 (GET-request或SignalR)