此流不支持使用流进行搜索操作

时间:2014-05-13 09:05:29

标签: c# asp.net-mvc-4 io stream

使用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,而不是我需要的。

如果您需要更多信息,请告诉我并更新此问题。

谢谢你们/女孩们

2 个答案:

答案 0 :(得分:12)

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及以上)来说不会很好用

答案 1 :(得分:0)

嘿谢谢你的帖子,它节省了我的一天! 我正在使用CSOM和EPPlus从SharePoint Office 365文档库中读取excel文件。 EPPlus不支持从SharePoint门户读取excel文件,使用上面的技巧我将FileInfo流转换为MemoryStream,EPPlus支持完美无缺。下面是我的代码

Stream stream1 = spFileInfo.Stream;
using (var stream2 = new MemoryStream())
{
  stream1.CopyTo(stream2);
  ExcelPackage xlPackage = new ExcelPackage(stream2);
  ExcelWorkbook workbook = xlPackage.Workbook;
}