I am using CsvHelper. Here I am trying to download a csv file from ftp and write to a class. It's throwing an error - Cannot access a disposed object. Object name: System.Net.Sockets.NetworkStream. from line - IEnumerable records = csv.GetRecords().ToList();
Any idea?
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();
}
In order to fix this issue, I had to do File reading and writing in csv separately like below
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();
}
}
When the using of responseStream
ends, it will close and dispose both the responseStream and its underlying stream which happens to be your FtpWebResponse response
. Which is why calling response.Close()
will throw Cannot access a disposed object
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With