Cannot access a disposed object. Object name: System.Net.Sockets.NetworkStream

Ehasan Rashdul Islam picture Ehasan Rashdul Islam · Apr 12, 2016 · Viewed 10k times · Source

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();
            }

Answer

Ehasan Rashdul Islam picture Ehasan Rashdul Islam · May 5, 2016

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();
    }
}