C# 无法访问已释放的对象。对象名称:System.Net.Sockets.NetworkStream
我正在使用CsvHelper。在这里,我试图从ftp下载一个csv文件并写入一个类。它正在抛出错误-无法访问已处置的对象。对象名称:System.Net.Sockets.NetworkStream。从第- IEnumerable records=csv.GetRecords().ToList() 有什么想法吗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.
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