【问题标题】:Response is not available in context? How to solve it?响应在上下文中不可用?如何解决?
【发布时间】:2011-12-21 17:57:36
【问题描述】:

我将 pdf 文件保存为流式传输。我想将流保存到响应流。但它总是抛出错误:响应在上下文中不可用。

代码如下:

using System;
using System.Threading;
using System.IO;

using Spire.Pdf;

namespace SingleThreadTest
{

    public partial class Test : System.Web.UI.Page
    {
        //[STAThread]
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        [STAThread]
        protected void Button1_Click(object sender, EventArgs e)
        {
            ////new a thread
            ThreadStart threadStart = HTMLToPDF;
            Thread thread = new Thread(threadStart);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        void HTMLToPDF()
        {
            PdfDocument doc = new PdfDocument();

            String url = "http://www.e-iceblue.com/";
            doc.LoadFromHTML(url, false, true, true);

            Response.ClearContent();
            Response.ClearHeaders();
            Response.BufferOutput = true;
            Response.ContentType = "application/pdf";

            using (MemoryStream pdfStream = new MemoryStream())
            {
                doc.SaveToStream(pdfStream);
                using (MemoryStream ms = new MemoryStream())
                {
                    //ms.WriteTo(Response.OutputStream);
                    Response.OutputStream.Write(pdfStream.ToArray(), 0, pdfStream.ToArray().Length);
                }
            }

            doc.SaveToHttpResponse("Test.pdf", Response, HttpReadType.Save);
            doc.Close();
        }
    }
}

我想给客户发送一个附件。如何实现它?(上面的代码我使用了Spire.PDF的第三个组件)。

提前致谢。

【问题讨论】:

  • 为什么要在新线程中做?

标签: c# stream


【解决方案1】:

您正在启动新线程来处理请求,但您的原始线程可能会继续执行并成功终止请求,而您的新线程甚至还没有对响应进行处理。必须在原线程中等待新线程完成(或许可以创造性地使用异步页面不阻塞原线程http://msdn.microsoft.com/en-us/magazine/cc163725.aspx)。

【讨论】:

  • 感谢您提供的信息。对我有用。
【解决方案2】:

我有类似的任务。我有一个数据集,我需要返回到客户端的 Excel 文件。

我使用 AXD 处理程序解决了问题。添加到 AXD 的 Web 配置引用。

查看示例

<httpHandlers>
      <add verb="GET,POST" path="Export.axd" type="YourNameSpace.ExportHandler, YouDLL"/>
</httpHandlers>

见下方代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Spire;
using Spire.Xls;

namespace SD.Reval.Admin.Services
{
    public class ExportHandler   : IHttpHandler
    {
        virtual public bool IsReusable
        {
            get { return true; }
        }


        virtual  public void ProcessRequest(HttpContext context)
        {
            try
            {

                Workbook workbook = new Workbook();
                Worksheet worksheet;

                int counter = 0;
                string methodName = HttpContext.Current.Request.QueryString["methodName"];
                string fileName = HttpContext.Current.Request.QueryString["fileName"];
                string parameters = HttpContext.Current.Request.QueryString["params"];
                if (parameters == null)
                    parameters = HttpContext.Current.Request.Form["params"];

                int workSheetCount = workbook.Worksheets.Count;
                string tableName = string.Empty ;

                if (methodName.Length > 0 && fileName.Length > 0)
                {

                    DataSet dataSet = (DataSet)ServiceInterface.InternalGenericInvoke(methodName, parameters);

                    foreach (DataTable dt in dataSet.Tables)
                    {
                        if (dt.Columns.Count > 0)
                        {
                            tableName = dt.TableName ;

                            if (counter >= workSheetCount)
                                worksheet=workbook.Worksheets.Add(tableName);
                            else
                            {
                                worksheet = workbook.Worksheets[counter];
                                worksheet.Name = tableName;
                            }


                            worksheet.InsertDataTable(dt, true, 4, 1, -1, -1);
                            counter++;
                            worksheet.AllocatedRange.AutoFitColumns();
                            worksheet.AllocatedRange.AutoFitRows();
                            worksheet.Pictures.Add(1, 1, SD.Reval.Admin.Services.ResourceFile.logo_reval );

                            //Sets header style
                            CellStyle styleHeader = worksheet.Rows[0].Style;
                            styleHeader.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                            styleHeader.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                            styleHeader.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                            styleHeader.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                            styleHeader.VerticalAlignment = VerticalAlignType.Center;
                            styleHeader.KnownColor = ExcelColors.Green;
                            styleHeader.Font.KnownColor = ExcelColors.White;
                            styleHeader.Font.IsBold = true;
                        }

                    }
                    fileName = fileName + ".xls";

                    workbook.SaveToHttpResponse(fileName, context.Response);

                    context.Response.Buffer = true;
                    context.Response.ContentType = "application/x-msdownload";
                    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName  );
                }


            }
            catch (Exception  ex)
            {
                Log.WriteLog(ex);
                throw new ApplicationException("The epxport process failed", ex);
            }
            finally
            {

            }
        }

    }
}

【讨论】:

  • 为什么我们需要“添加到 AXD 的 web 配置引用”?我不清楚。你能告诉我更多细节吗?提前致谢。
  • 代码仍然运行不成功。我找不到问题的关键。
  • (我尝试在 Web 应用程序中执行以下步骤)我尝试将 Html 从 URL 加载到 PDF 文件,然后将 pdf 文件保存为流。
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
相关资源
最近更新 更多