Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此流不支持使用流的查找操作_C#_Asp.net Mvc 4_Io_Stream - Fatal编程技术网

C# 此流不支持使用流的查找操作

C# 此流不支持使用流的查找操作,c#,asp.net-mvc-4,io,stream,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.CsvProduc

使用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
}
public虚拟IList importsStoreProductsFromCSV(Stream-Stream,int-storeContext=0,int-vendorId=0,bool-deleteUnmatched=false){
//存储始终针对所有存储上传
storeContext=0;
使用(var s=新CsvReader(流)){
//将CSV文件流读取到列表中
……等等
}
当然,错误位于使用系统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);
    }
//
///初始化读卡器以从现有流工作
/// 
///溪流
公共CsvReader(溪流){
_type=type.Stream;
初始化(流、编码、默认);
}
好的,上面是一段源于nop商业和自定义插件的实际代码片段。但是我相信错误在于流的过程中的某些地方

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

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

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


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

A
ResponseStream
确实不支持搜索操作。您可以通过查看
CanSeek
属性来验证这一点

一个简单的解决方案:

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

但是对于非常大的数据流(例如100MB及以上)来说,这不太好。

嘿,谢谢你的帖子,它救了我一天!! 我正在使用CSOM和EPPlus从SharePoint office 365文档库读取excel文件。EPPlus不支持从SharePoint portal读取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;
}

啊,太棒了,我没有想到我可以复制到另一个流并使用它。简短的切中要害的解决方案。有+1和一个可接受的答案!