如何从Web表单应用程序返回多个“文档”?

时间:2012-03-12 14:43:53

标签: asp.net wcf crystal-reports webforms

我们有一个生成参数文档的webforms应用程序。用户提供一些信息,单击按钮,我们的Web服务生成Word文档。

该服务一次只能处理一个文档,但不能批处理。我们希望添加处理多个文档的功能。我们现在有下面的代码,其中contactIdsForLetters是List<int>

foreach (int contactId in contactIdsForLetters)
{
    string parameters = string.Format("ContactID~{0}", contactId);

    string defaultFilename = Reporting.Utilities.CreateDefaultFileName(outputformat);

    byte[] bytes = Reporting.Reports.CreateReport(selectedReportId, parameters, outputformat, out serviceCallWasSuccessful);

    if (!serviceCallWasSuccessful || bytes == null)
    {
        Reporting.Reports.LogReportActivity(selectedReportId, string.Empty, parameters, userLogin, false);

        return;
    }

    Reporting.Reports.LogReportActivity(selectedReportId, string.Empty, parameters, userLogin, true);

    Reporting.Utilities.SendResponse(defaultFilename, bytes);
}

运行上面的代码时,只返回一个文档。处理一个文档(For-Each永远不会到达contactIdsForLetters中的第二个项目),弹出一个对话框,要求打开或保存文件,单击打开后,Word将打开文档。一切都在发生,但我们无法让For-Each处理第二个及后续的文件。

用户希望为返回的每个文档单独的Word会话。后续文档需要在自己的Word会话中打开。

如何遍历List<int>,一次一个地将每个int发送到服务,并为每个返回的文档打开Word会话?

这是SendResponse()...

public static void SendResponse(string defaultFilename, byte[] bytes)
{
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.Buffer = false;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", defaultFilename));
    HttpContext.Current.Response.AppendHeader("Content-Length", bytes.Length.ToString());
    HttpContext.Current.Response.BinaryWrite(bytes);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
}

2 个答案:

答案 0 :(得分:0)

List<int>发送到服务并让服务返回List<byte[]>应该没有问题。

我不知道“打开Word会话”是什么意思。我希望你不要试图从ASP.NET应用程序调用Word。这是不受支持的,不可靠,并且效果不佳。

答案 1 :(得分:0)

ASP.NET在顶级HTTP上运行。

HTTP基于每个请求。

如果浏览器能够访问服务器,则每个请求都会返回响应。 此响应包含一个流(我们可以在您的情况下将其称为File)。 在服务器刷新该流(第一个文件)之后,关闭与服务器的请求连接并且请求生命周期结束,关闭与该请求相关的任何线程。 这就是你永远无法获得第二份文件的原因。

您将必须在压缩容器(如zip文件)中传送文档,以便所有文档都在一个流中。首先获取所有文档,打包并将响应发送给客户端。

希望这有帮助。

UPDATE:此外,您可能希望使用AJAX生成对服务器的javascript调用,返回不同的链接以提取不同的文档。这可能就像点击用户单击单个按钮或链接后打开不同文档的不同隐形链接一样。使用这种方法很容易实现你想要的。您可以使用javascript触发所有不可见链接的click事件。