Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Asp.net 如何在HTTP响应中发送文件和页面?_Asp.net_Http Headers_Response - Fatal编程技术网

Asp.net 如何在HTTP响应中发送文件和页面?

Asp.net 如何在HTTP响应中发送文件和页面?,asp.net,http-headers,response,Asp.net,Http Headers,Response,我有一个ASP.NET页面,在其中生成Excel电子表格并将其发送到响应中(内容处置标题)。这一部分工作得很好,但我有一个按钮永远不会重新启用,因为原始页面不是响应的一部分 下面是我正在使用的函数: Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse) Dim theStream As New System

我有一个ASP.NET页面,在其中生成Excel电子表格并将其发送到响应中(内容处置标题)。这一部分工作得很好,但我有一个按钮永远不会重新启用,因为原始页面不是响应的一部分

下面是我正在使用的函数:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse)
    Dim theStream As New System.IO.MemoryStream()
    theWorkBook.Save(theStream)

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte())

    theStream.Position = 0
    theStream.Read(byteArr, 0, CInt(theStream.Length))
    theStream.Close()

    resp.Clear()
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName)
    resp.BinaryWrite(byteArr)
    resp.End()
End Sub
我尝试不清除响应,而是使用AppendHeader而不是AddHeader,但响应仍然只包含文件


我错过了什么?我需要使用不同的标题吗?我发现了这个;听起来像是我的问题。

您不能在同一响应中发回文件和新页面


我不确定该解决方案如何满足您的特定需求,但请记住,您可以在文件创建请求发送到服务器之前使用Javascript启用或禁用按钮(这样,当用户开始下载电子表格时,按钮已经处于您想要的状态).

您不能在同一响应中发回文件和新页面


我不确定该解决方案如何满足您的特定需求,但请记住,您可以在文件创建请求发送到服务器之前使用Javascript启用或禁用按钮(这样,当用户开始下载电子表格时,按钮已经处于您想要的状态)。

您不能。您可以通过单击按钮打开一个弹出窗口,让弹出窗口提供文件并从javascript发回页面来伪造行为。但通过这种方式,您实际上创建了两个请求和两个响应

更新:如果你想在他们开始下载时禁用该按钮,并在下载开始后立即启用它,你不能真正做到这一点,但你可以使用一些技巧使其看起来像那样。当他们点击下载按钮时,使用一些javascript来禁用按钮并创建弹出窗口,启动文件流。当filestreaming函数(WriteToResponse)返回时,在用户会话中设置一些值。同时,让原始页面使用AJAX轮询服务器,查看会话值是否已设置。如果已设置,请重新启用按钮,并再次将值设置为空或假(因此这将第二次起作用)。但这看起来像是一大堆把戏


但我认为在这种情况下,治疗比问题更糟糕。我假设您希望这样做,因为生成文件需要一段时间,您不希望用户在准备文件时不耐烦地按下按钮来重置流。要完成这一点,我只需在“按钮按下”页面上显示一条弹出消息,上面写着“您的下载正在准备中。这可能需要一分钟。感谢您的耐心。(单击以取消此消息)

您不能。您可以通过单击按钮打开一个弹出窗口,让弹出窗口提供文件并从javascript发回页面来伪造行为。但通过这种方式,您实际上创建了两个请求和两个响应

更新:如果你想在他们开始下载时禁用该按钮,并在下载开始后立即启用它,你不能真正做到这一点,但你可以使用一些技巧使其看起来像那样。当他们点击下载按钮时,使用一些javascript来禁用按钮并创建弹出窗口,启动文件流。当filestreaming函数(WriteToResponse)返回时,在用户会话中设置一些值。同时,让原始页面使用AJAX轮询服务器,查看会话值是否已设置。如果已设置,请重新启用按钮,并再次将值设置为空或假(因此这将第二次起作用)。但这看起来像是一大堆把戏

但我认为在这种情况下,治疗比问题更糟糕。我假设您希望这样做,因为生成文件需要一段时间,您不希望用户在准备文件时不耐烦地按下按钮来重置流。要完成此操作,我只需在“按钮按下”页面中显示一条弹出消息,内容类似于“您的下载正在准备中。这可能需要一分钟。感谢您的耐心。(单击以取消此消息)