C# 无法访问已释放的对象。对象名称:System.Net.Sockets.NetworkStream

C# 无法访问已释放的对象。对象名称:System.Net.Sockets.NetworkStream,c#,ftpwebrequest,csvhelper,C#,Ftpwebrequest,Csvhelper,我正在使用CsvHelper。在这里,我试图从ftp下载一个csv文件并写入一个类。它正在抛出错误-无法访问已处置的对象。对象名称:System.Net.Sockets.NetworkStream。从第- IEnumerable records=csv.GetRecords().ToList() 有什么想法吗 request.Credentials = new NetworkCredential(ftpUser, ftpPwd); request.

我正在使用CsvHelper。在这里,我试图从ftp下载一个csv文件并写入一个类。它正在抛出错误-无法访问已处置的对象。对象名称:System.Net.Sockets.NetworkStream。从第- IEnumerable records=csv.GetRecords().ToList()

有什么想法吗

            request.Credentials = new NetworkCredential(ftpUser, ftpPwd);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.UseBinary = true;

            // Csv file
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (TextReader tr = new StreamReader(responseStream))
                        {
                            using (CsvReader csv = new CsvReader(tr))
                            {
                                if (csvUpload.IncludeInvoice) csv.Configuration.RegisterClassMap<PacketUploadInvoiceMasterMap>();
                                else csv.Configuration.RegisterClassMap<PacketUploadBasicMasterMap>();

                                IEnumerable<PacketUploadMaster> records = csv.GetRecords<PacketUploadMaster>().ToList();

                                pumResults = records.ToList();
                            }
                        }
                    }
                }

                response.Close();
            }
request.Credentials=新的网络凭证(ftpUser,ftpPwd);
request.Method=WebRequestMethods.Ftp.DownloadFile;
request.UseBinary=true;
//Csv文件
使用(FtpWebResponse响应=(FtpWebResponse)request.GetResponse())
{
使用(Stream responseStream=response.GetResponseStream())
{
if(responseStream!=null)
{
使用(TextReader tr=新的StreamReader(responseStream))
{
使用(CsvReader csv=新CsvReader(tr))
{
if(csvUpload.IncludeInvoice)csv.Configuration.RegisterClassMap();
else csv.Configuration.RegisterClassMap();
IEnumerable records=csv.GetRecords().ToList();
pumResults=records.ToList();
}
}
}
}
response.Close();
}

为了解决这个问题,我必须分别以csv格式读取和写入文件,如下所示

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
{
    if (responseStream != null)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            responseStream.CopyTo(ms);
            streamInByte = ms.ToArray();
        }
    }
}

using (TextReader tr = new StreamReader(new MemoryStream(streamInByte), Encoding.Default))
{
    using (CsvReader csv = new CsvReader(tr))
    {
        // The value used to escape fields that contain a delimiter, quote, or line ending.
        // csv.Configuration.Quote = '"';
        if (csvUpload.IncludeInvoice) csv.Configuration.RegisterClassMap<PacketUploadInvoiceMasterMap>();
        else csv.Configuration.RegisterClassMap<PacketUploadBasicMasterMap>();

        // Remove white space from header
        csv.Configuration.TrimHeaders = true;

        IEnumerable<PacketUploadMaster> records = csv.GetRecords<PacketUploadMaster>().ToList();

        pumResults = records.ToList();
    }
}
使用(FtpWebResponse响应=(FtpWebResponse)请求.GetResponse())
使用(Stream responseStream=response.GetResponseStream())
{
if(responseStream!=null)
{
使用(MemoryStream ms=new MemoryStream())
{
响应团队副本(ms);
streamInByte=ms.ToArray();
}
}
}
使用(TextReader tr=new StreamReader(new MemoryStream(streamInByte),Encoding.Default))
{
使用(CsvReader csv=新CsvReader(tr))
{
//用于转义包含分隔符、引号或行尾的字段的值。
//csv.Configuration.Quote='”;
if(csvUpload.IncludeInvoice)csv.Configuration.RegisterClassMap();
else csv.Configuration.RegisterClassMap();
//删除标题中的空白
csv.Configuration.TrimHeaders=true;
IEnumerable records=csv.GetRecords().ToList();
pumResults=records.ToList();
}
}

responseStream
的使用结束时,它将关闭并处理responseStream及其底层流,这恰好是您的
FtpWebResponse响应
。这就是调用
response.close()的原因
将抛出
无法访问已处置对象

您不应调用close并将其用作一次性对象。这并不能解决问题。请详细说明,您使用的是什么库(CsvReader)?CsvHelper