C# 数字签名分离期间无法访问关闭流错误

C# 数字签名分离期间无法访问关闭流错误,c#,asp.net,pdf,itext,C#,Asp.net,Pdf,Itext,请帮我解决这个问题。显示错误显示无法访问关闭的流。 我使用的内存流从RLDC和水印首先然后数字签名的过程开始 我认为最后6行有问题,或者我没有正确关闭变量 我做错了什么 public static byte[] AddWatermark(byte[] bytes, BaseFont baseFont, string watermarkText) { using (var ms = new MemoryStream(10 * 1024)) {

请帮我解决这个问题。显示错误显示无法访问关闭的流。 我使用的内存流从RLDC和水印首先然后数字签名的过程开始

我认为最后6行有问题,或者我没有正确关闭变量

我做错了什么

public static byte[] AddWatermark(byte[] bytes, BaseFont baseFont, string watermarkText)
    {

        using (var ms = new MemoryStream(10 * 1024))
        {
            using (var reader = new PdfReader(bytes))
            using (var stamper = new PdfStamper(reader, ms))
            {
                var pages = reader.NumberOfPages;
                for (var i = 1; i <= pages; i++)
                {

                    var dc = stamper.GetOverContent(i);
                    AddWaterMarkText(dc, watermarkText, baseFont, 100, 45, BaseColor.GRAY, reader.GetPageSizeWithRotation(i));


                    // Keypair Generator
                    RsaKeyPairGenerator kpGenerator = new RsaKeyPairGenerator();
                    kpGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));

                    // Create a keypair
                    AsymmetricCipherKeyPair kp = kpGenerator.GenerateKeyPair();

                    // Certificate Generator
                    X509V3CertificateGenerator cGenerator = new X509V3CertificateGenerator();
                    cGenerator.SetSerialNumber(BigInteger.ProbablePrime(120, new Random()));
                    cGenerator.SetSubjectDN(new X509Name("CN=" + "abc.com"));
                    cGenerator.SetIssuerDN(new X509Name("CN=" + "Aalok"));
                    cGenerator.SetNotBefore(DateTime.Now);
                    cGenerator.SetNotAfter(DateTime.Now.Add(new TimeSpan(365, 0, 0, 0))); // Expire in 1 year
                    cGenerator.SetSignatureAlgorithm(HashType.SHA256withRSA.ToString()); // See the Appendix Below for info on the hash types supported by Bouncy Castle C#
                    cGenerator.SetPublicKey(kp.Public); // Only the public key should be used here!
                    Org.BouncyCastle.X509.X509Certificate cert = cGenerator.Generate(kp.Private); // Create a self-signed cert

                    byte[] encoded = cert.GetEncoded();
                    try
                    {
                        FileStream outStream = new FileStream("abc.der", FileMode.Create, FileAccess.ReadWrite);
                        {
                            outStream.Write(encoded, 0, encoded.Length);
                        }
                    }
                    catch (FileNotFoundException)
                    {
                        Console.WriteLine("File not found");
                    }
                   
                    // Create the PKCS12 store
                    Pkcs12Store store = new Pkcs12StoreBuilder().Build();

                    // Add a Certificate entry
                    X509CertificateEntry certEntry = new X509CertificateEntry(cert);
                    store.SetCertificateEntry(cert.SubjectDN.ToString(), certEntry); // use DN as the Alias.

                    // Add a key entry
                    AsymmetricKeyEntry keyEntry = new AsymmetricKeyEntry(kp.Private);
                    store.SetKeyEntry(cert.SubjectDN.ToString() + "_key", keyEntry, new X509CertificateEntry[] { certEntry }); // Note that we only have 1 cert in the 'chain'

                    // Save to the file system
                    try
                    {
                        var filestream = new FileStream(@"abc.pfx", FileMode.Create, FileAccess.ReadWrite);
                        {
                            store.Save(filestream, "123".ToCharArray(), new SecureRandom());
                        }
                    }
                    catch (FileNotFoundException)
                    {
                        Console.WriteLine("File not found");
                    }




                   
                    String alias = "";
                    ICollection<Org.BouncyCastle.X509.X509Certificate> chain = new List<Org.BouncyCastle.X509.X509Certificate>();
                    // searching for private key
                    foreach (string al in store.Aliases)
                        if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate)
                        {
                            alias = al;
                            break;
                        }
                    AsymmetricKeyEntry pk = store.GetKey(alias);
                    foreach (X509CertificateEntry c in store.GetCertificateChain(alias).ToList())
                    {
                        chain.Add(c.Certificate); 
                    }
                    RsaPrivateCrtKeyParameters parameters = pk.Key as RsaPrivateCrtKeyParameters;


                    PdfReader read = new PdfReader(bytes);
                    // PdfStamper.CreateSignature(read, ms, '\0');
                    PdfStamper stamp = PdfStamper.CreateSignature(read, ms, '\0');
                    // Creating the appearance
                    PdfSignatureAppearance appearance = stamp.SignatureAppearance;

                    appearance.Reason = "My reason for signing";
                    appearance.Location = "The middle of nowhere";
                   // appearance.SignDate = DateTime.Now;
                    appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
                    // Creating the signature
                    IExternalSignature pks = new PrivateKeySignature(parameters, DigestAlgorithms.SHA256);
                    MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, CryptoStandard.CMS);

                    stamp.Close();
                    read.Close();
                    break;

                }
                
                //stamper.Close();
                reader.Close();
                ms.Close();
            }
            return ms.ToArray();
        }


    }
publicstaticbyte[]AddWatermark(byte[]bytes,BaseFont,BaseFont,stringwatermarktext)
{
使用(var ms=新内存流(10*1024))
{
使用(变量读取器=新PdfReader(字节))
使用(var压模=新PdfStamper(读卡器,ms))
{
var pages=reader.NumberOfPages;

对于(var i=1;i哪一行代码引发错误?对于使用
ed(例如,
ms
)的
变量,不需要调用
Close
)。每当调用stamper.Close()函数时,它直接捕获错误“无法访问关闭的流”进入我的父函数。@mjwills好的,让我详细解释一下。stamp.Close()上面的6行代码;如果被注释,则不存在此类问题,并且生成的pdf没有数字签名。但是,如果我取消注释这6行,则会发生此错误。在上面的代码中,我在最后几行中编写的所有Close语句都存在,因为我之前已经测试过,在发布之前忘记从代码中删除。主要问题是6 l在
中使用(var stamper=new PdfStamper(reader,ms))
块创建另一个stamper
PdfStamper stamp=PdfStamper.CreateSignature(read,ms,“\0”);
写入同一目标
内存流ms
。因此,即使该代码没有抛出错误,您也会在
ms
中得到两个结果文件的大杂烩。