2011-12-21 11 views
0

私はPDFファイルをストリームに保存します。ストリームをレスポンスストリームに保存します。しかし、それは常にエラーを投げます:応答はcontexでは利用できません。ここで応答は文脈で利用できませんか?どのようにそれを解決するには?

は、コードは次のとおりです。

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の第3のコンポーネントを使用しています)。

ありがとうございます。

+0

を参照してください例を参照してください。 –

答えて

1

リクエストを処理するために新しいスレッドを開始していますが、元のスレッドは実行を続行して新しいスレッドが応答で何かをする前に要求を正常に終了します。元のスレッドの新しいスレッドの完了を待つ必要があります(元のスレッドhttp://msdn.microsoft.com/en-us/magazine/cc163725.aspxをブロックしないように非同期ページを創造的に使用できるかもしれません)。

+0

ご提供いただいた情報をありがとうございます。それは私には有益です。 – Tina

0

私は同様の仕事をしていました。私はデータセットを持っていて、クライアントに戻す必要がありました。

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

      } 
     } 

    } 
} 
+0

「AXDにWeb設定の参照を追加する」必要があるのはなぜですか?私はそれについて明確ではない。詳細を教えてください。前もって感謝します。 – Tina

+0

応答が –

+0

に更新されました。コードは依然として正常に実行されません。私は問題のポイントを見つけることができません。 – Tina

関連する問題