在我们的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);
}
}
答案 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;
这里的setTimeout方法仅用于模拟响应时间。
答案 1 :(得分:0)
如果我理解正确,您可以分两步生成pdf文件。 第一步是要求Web服务器生成pdf文件。 (POST请求) 第二步是询问Web服务器是否已生成pdf文件。 (GET-request或SignalR)