Нет доступа к удаленному объекту. Имя объекта: System.Net.Sockets.NetworkStream

Я использую CsvHelper. Здесь я пытаюсь загрузить csv-файл с ftp и записать его в класс. Выдает ошибку - Невозможно получить доступ к удаленному объекту. Имя объекта: 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();
            }

person Ehasan Rashdul Islam    schedule 11.04.2016    source источник
comment
не стоит звонить близко и использовать как одноразовый.   -  person Daniel A. White    schedule 12.04.2016
comment
это не решает проблему, хотя   -  person Ehasan Rashdul Islam    schedule 12.04.2016
comment
не могли бы вы уточнить, какую библиотеку (CsvReader) вы используете?   -  person Thariq Nugrohotomo    schedule 12.04.2016
comment
CsvHelper joshclose.github.io/CsvHelper   -  person Ehasan Rashdul Islam    schedule 12.04.2016


Ответы (2)


Чтобы решить эту проблему, мне пришлось выполнять чтение и запись файлов в 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();
    }
}
person Ehasan Rashdul Islam    schedule 05.05.2016

Когда использование responseStream закончится, он закроет и удалит как responseStream, так и его базовый поток, который оказывается вашим FtpWebResponse response. Вот почему вызов response.Close() вызовет Cannot access a disposed object.

person pm.lemay    schedule 06.03.2017