Ответ не доступен в контексте?Как это решить? - PullRequest
0 голосов
/ 21 декабря 2011

Я сохраняю файл 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).

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Вы запускаете новый поток для обработки запроса, но ваш исходный поток, вероятно, продолжает выполнение и успешно завершает запрос, прежде чем ваш новый поток даже попытается что-то сделать с ответом. Вам нужно дождаться завершения новой темы в исходной теме (возможно, вы сможете творчески использовать асинхронные страницы, чтобы не блокировать исходную тему http://msdn.microsoft.com/en-us/magazine/cc163725.aspx).

0 голосов
/ 21 декабря 2011

У меня была похожая задача. У меня был набор данных, и мне нужно было вернуться к клиентскому файлу Excel.

Я решил с помощью обработчика AXD. Добавьте в веб-конфигурацию ссылку на AXD.

См. Пример

<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
            {

            }
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...