无法访问在Web应用程序中创建的文件

时间:2015-04-17 12:47:06

标签: c# wcf service itextsharp

这是我在wcf服务中使用的代码。它成功生成PDF,但在生成文档后,生成PDF的文件夹会出现错误:"访问被拒绝"

PDF已针对网站关闭,但对于连续的Web服务,它不会关闭。

string r = builder.ToString();
string pdfname = Fuhre + "_" + ProtokolType + "_" + GeraeteNr + "_" + r;

PdfWriter.GetInstance(document, new FileStream(@"C:\inetpub\wwwroot\protokoll_pdfs\"+pdfname+".pdf",FileMode.Create));
document.Open();
WebClient wc = new WebClient();
string htmlText = html;
//Response.Write(htmlText);
List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null);
for (int k = 0; k < htmlarraylist.Count; k++)
{
   document.Add((IElement)htmlarraylist[k]);
}

pdflink1 = pdfname + ".pdf";
htmlpdflink =""+pdflink1;
document.Close();

4 个答案:

答案 0 :(得分:2)

你需要小心处理所有事情。

    using(var filesStream = new FileStream())
    {
        using(PdfWriter wri = PdfWriter.GetInstance(doc, fileStream)) 
        {
    ...
        }
    }

答案 1 :(得分:0)

您可能想要关闭一些其他对象(Stream,Document)。下面显示了如何执行操作的示例。

FileStream stream = new FileStream(filePath, FileMode.CreateNew);            
Document doc = new Document(PageSize.A4, 24, 24, 24, 24);
PdfWriter writer = PdfWriter.GetInstance(doc, stream);

doc.Open();

//PDF writing operations here


writer.Flush();
doc.Close();
writer.Close();
stream.Close();

答案 2 :(得分:0)

您希望将文件提供给浏览器和/或您希望将文件保存在磁盘上。

在这种情况下,您将受益于在内存中创建文件,然后将字节发送到浏览器以及磁盘上的文件。在以下问题的答案中解释了这一点:Pdf file not loading properly created by the servlet

上面提到的答案是用Java编写的,所以你必须对它进行调整。

您可以通过查看其他示例来完成此操作。例如:Create PDF in memory instead of physical file

byte [] pdfBytes; 使用(var mem = new MemoryStream()) {     使用(PdfWriter wri = PdfWriter.GetInstance(doc,mem))     {         doc.Open(); //打开要写的文档         段落段落=新段落(&#34;这是我使用段落的第一行。&#34;);         短语pharse =新短语(&#34;这是我使用Pharse的第二行。&#34;);         Chunk chunk = new Chunk(&#34;这是我使用Chunk的第三行。&#34;);

    doc.Add(paragraph);

    doc.Add(pharse);

    doc.Add(chunk); 
}
pdfBytes = mem.ToArray();

}

现在,您可以将pdfBytes写入Web应用程序中的Response对象:

private void ShowPdf(byte[] strS)
{
    Response.ClearContent();
    Response.ClearHeaders();
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);

    Response.BinaryWrite(strS);
    Response.End();
    Response.Flush();
    Response.Clear();
}

您可以重复使用这些字节将其写入FileCan a Byte[] Array be written to a file in C#?

File.WriteAllBytes(string path, byte[] bytes)

如果问题仍然存在,那么您知道它不是由iTextSharp引起的,因为iTextSharp只会产生字节。

答案 3 :(得分:0)

除了其他人所说的内容之外,我强烈建议您将每个流程分成多个不相互影响的部分,并且彼此之间并不了解。然后尽可能独立地测试每个部分。例如:

private void makePDF( filePath )
{
    //Create the PDF
}

private void main()
{
    //Make the PDF
    makePDF( "test.pdf" );

    //If this line fails then your makePDF code has an open handle
    File.Delete( "test.pdf" );
}

然后继续:

private void makePDF( filePath )
{
    //Create the PDF
}

private void emailPDF( filePath )
{
    //Email the PDF
}

private void main()
{
    //Make the PDF
    makePDF( "test.pdf" );
    emailPDF( "test.pdf" );

    //If this line fails now then your emailPDF code has an open handle
    File.Delete( "test.pdf" );
}

重要的一部分,如果你不是一次性尝试500件事,因为这导致了某些东西锁定了我的文件,但我不知道&#34;。