Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
C# 无法访问在web应用程序中创建的文件_C#_Wcf_Service_Itextsharp - Fatal编程技术网

C# 无法访问在web应用程序中创建的文件

C# 无法访问在web应用程序中创建的文件,c#,wcf,service,itextsharp,C#,Wcf,Service,Itextsharp,这是我在wcf服务中使用的代码。它成功生成PDF,但在生成文档后,生成PDF的文件夹出现错误:“访问被拒绝” 网站的PDF已关闭,但连续web服务的PDF未关闭 string r = builder.ToString(); string pdfname = Fuhre + "_" + ProtokolType + "_" + GeraeteNr + "_" + r; PdfWriter.GetInstance(document, new FileStream(@"C:\inetpub\wwwr

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

网站的PDF已关闭,但连续web服务的PDF未关闭

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();
string r=builder.ToString();
字符串pdfname=Fuhre+“”+原型+“”+geratenr+“”+r;
GetInstance(文档,新文件流(@“C:\inetpub\wwwroot\protokoll_pdfs\”+pdfname+“.pdf”,FileMode.Create));
document.Open();
WebClient wc=新的WebClient();
字符串htmlText=html;
//Response.Write(htmlText);
List htmlaraylist=HTMLWorker.parsetList(新的StringReader(htmlText),null);
for(int k=0;k
您可能需要关闭一些其他对象(流、文档)。如何执行该操作的示例如下所示

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();

你需要小心处理一切

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

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

在这种情况下,您将受益于在内存中创建文件,然后将字节发送到浏览器以及磁盘上的文件。对以下问题的答复对此作了解释:

上面提到的答案是用Java编写的,因此您必须修改它

您可以通过查看其他示例来做到这一点。例如:

字节[]pdfBytes; 使用(var mem=new MemoryStream()) { 使用(PdfWriter wri=PdfWriter.GetInstance(doc,mem)) { doc.Open();//打开要写入的文档 段落=新段落(“这是我使用段落的第一行”); 短语pharse=新短语(“这是我使用pharse的第二行”); Chunk Chunk=新Chunk(“这是我使用Chunk的第三行”)

}

现在,您可以将
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();
}
您可以重复使用字节将其写入
文件


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

除了其他人所说的,我强烈建议您将每个进程分成多个部分,这些部分不相互作用,甚至彼此都不知道。然后尽可能独立地测试每个部分.例如:

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件事情,因为这会导致“有东西锁定了我的文件,但我不知道是什么”。

“访问被拒绝”与“无法关闭”不同这意味着对该文件的访问被拒绝。你的问题是错误的。另外:你为什么要将PDF创建为文件?如果人们同时创建同一个文件会怎么样?那样的话,你就有大麻烦了。请不要将你糟糕的编码做法归咎于iTextSharp。我已经更新了你的问题,但问题仍然不清楚。你是什么意思当你说“文件夹给出了错误,访问被拒绝”?文件夹本身不会抛出这样的错误。你想用文件夹做什么?另外:你说“网站的PDF关闭了,但连续web服务的PDF没有关闭”的意思不清楚你是说PDF被锁定了吗?这很可能是因为你选择在磁盘上创建文件。你如何确保两个不同的用户不会尝试写入同一个文件?是的,先生,我是初学者,简而言之,PDF已成功生成,但当我关闭wcf服务时,我无法在运行时读取PDF我无法打开wcf服务。这是一个错误“您的文件被另一个程序使用”。这意味着wcf服务将继续打开并处理此pdf文件。提前感谢您是否需要磁盘上的文件?问题是PdfWriter类仍然有该文件的句柄。请将其包装为“使用”子句。@BrunoLowagie为了您的利益,请阅读此链接。请检查从类com.itextpdf.text.DocWriter继承的部分方法,您可能会看到一个刷新。这里的代码示例来自一个实时项目,它工作得很好。您可能想在拍摄之前尝试一下代码。好的,我忽略了该方法。我15年前编写了这些类去吧。我什么都记不起来了(为了你的利益,看看我的个人资料)。无论如何:如果你查阅代码,你会看到
doc.Close()
导致一系列事件关闭了
编写器
以及
。@BrunoLowagie刚刚检查了您的个人资料:)并怀疑了我自己的代码。顺便说一句,很棒的库。谢谢,我认为@BDH的答案才是真正的解决方案。@BrunoLowagie不会让编写器关闭。close以不同的方式完全按照BDH所说的做。我我想这确实是一种方式。我只是想做,我的服务没有关闭,但在生成文件后,成功创建了pdf,因为我发送了该文件。在邮件附件中,我可以看到所有数据。如果不关闭wcf服务,我无法看到该文件。我必须停止服务才能看到该文件。我只是想知道如何才能查看该文件查看文件时不进行解释或关闭文件。这是我的目标
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" );
}