gpt4 book ai didi

c# - 该流不支持seek操作,使用stream

转载 作者:行者123 更新时间:2023-11-30 19:05:19 25 4
gpt4 key购买 nike

使用 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);
}

好吧,上面是一小段深入 Root 于 nop 商务和自定义插件的实际代码。但是我认为故障出在流的某个地方。

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

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

我希望我的错误是小的,我不希望再创建一个新的插件和扩展 Nop。

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

最佳答案

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 及以上)来说效果不佳

关于c# - 该流不支持seek操作,使用stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23626965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com