这个流不支持查找操作,使用stream

本文关键字:使用 stream 操作 查找 不支持 | 更新日期: 2023-09-27 18:03:08

使用c# ASP.net 4.5, Nopcommerce CMS, MVC 4和visual studio 2012。

这似乎是一个常见的问题,我已经搜索了"谷歌"。我还没有找到一个适合我需要的解决方案。

请注意,这不是我的代码,我被要求修复这个问题(我对文件I/O的知识也有限,只是基础知识)。

错误堆栈跟踪为:

"   at System.Net.ConnectStream.set_Position(Int64 value)'r'n   at   Hroc.Plugin.Core.CsvProductManagement.Services.CsvReader.Initialise(Stream stream, Encoding encoding)'r'n   at Hroc.Plugin.Core.CsvProductManagement.Services.CsvReader..ctor(Stream stream)'r'n   at Hroc.Plugin.Core.CsvProductManagement.Services.ImportService.ImportStoreProductsFromCsv(Stream stream, Int32 storeContext, Int32 vendorId, Boolean deleteUnmatched)'r'n   at Hroc.Plugin.Core.CsvProductManagement.Services.StaticImportFile.GetStoreProductImportMessages(Stream stream, Int32 storeContext, Int32 vendorId, Boolean deleteUnmatched)'r'n   at Hroc.Plugin.Core.CsvProductManagement.Tasks.ImportFilesTask.Execute()'r'n   at Nop.Services.Tasks.Task.Execute(Boolean throwException) in c:''Users''stevesmith''Documents''GitHub''Store''Libraries''Nop.Services''Tasks''Task.cs:line 83"

现在的代码,我会尽量保持它尽可能短(虽然它是MVC,所以准备101个不同的方法…

public void Execute() {
        if (_importTaskSettings.Enabled) {
            var response = HttpWebRequest.Create(_importTaskSettings.ImportFileUrl).GetResponse();
            
            if (response != null)
            {
                using (var stream = response.GetResponseStream())
                {
                    var messages = StaticImportFile.GetStoreProductImportMessages(stream, 0, 1, true); //error occurs here
                    _logger.Information(string.Format("Import Store products file task complete. Messages: {0}", string.Join(", ", messages))); 
                }
            }
            else {
                //_logger.Information('import was called but is null');
            }
        }
    }

此方法用于后台任务中的计时器,为了调试目的,它当前设置为30秒。

public virtual IList<string> ImportStoreProductsFromCsv(Stream stream, int storeContext = 0, int vendorId = 0, bool deleteUnmatched = false) {
        // Store always uploads against all stores
        storeContext = 0;
        using (var s = new CsvReader(stream)) {
            // read CSV file stream into List
.....etc etc
}

,当然错误是在使用系统CsvReader。

 /// <summary>
    /// Initialises the reader to work from an existing stream
    /// </summary>
    /// <param name="stream">Stream</param>
    public CsvReader(Stream stream) {
        _type = Type.Stream;
        Initialise(stream, Encoding.Default);
    }

好的,上面是一个小片段的实际代码深深扎根于nop商业和自定义插件。然而,我相信故障在流的过程中的某个地方。

这里的目的是保存在服务器某处的文件每小时更新一次。管理员没有访问该文件的权限,但是这些产品也需要更新。当这样的任务运行时,查找路径创建一个流,并使用nop commerce的方法将文件数据输入到商店网站。

现在看了很多论坛,大多数人说这是一种试图从开放流中写作的行为,同时试图寻求?(不确定措辞是否正确)从这个实际的过程中没有意义,试图在流中寻求?

我希望我的错误是小的,我不希望有创建一个新的插件和扩展Nop比我需要太多。

如果您需要更多的信息,请告诉我,我会更新这个问题。

这个流不支持查找操作,使用stream

A ResponseStream确实不支持Seek操作。你可以通过观察CanSeek的性质来验证这一点。

一个简单的解决方案:

using (var stream1 = response.GetResponseStream())
using (var stream2 = new MemoryStream())
{
    stream1.CopyTo(stream2);
    var messages = StaticImportFile.GetStoreProductImportMessages(stream2, 0, 1, true);
}

但是对于非常大的流(例如100 MB及以上)