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