我的目标是将约3000条记录的产品CSV上传到我的电子商务网站。我想利用我的电子通信平台提供的REST API,所以我可以重用一些东西,并为将来创建的网站进行构建。
我遇到的主要问题是: - System.Threading.ThreadAbortException
我只能说通过POST请求处理所有3K记录所需的时间。我的代码:
public ActionResult WriteProductsFromFile()
{
string fileNameIN = "19107.txt";
string fileNameOUT = "19107_output.txt";
string jsonUrl = $"/api/products";
List<string> ls = new List<string>();
var engine = new FileHelperAsyncEngine<Prod1>();
using (engine.BeginReadFile(fileNameIN))
{
foreach (Prod1 prod in engine)
{
outputProduct output = new outputProduct();
if (!string.IsNullOrEmpty(prod.name))
{
output.product.name = prod.name;
string productJson = JsonConvert.SerializeObject(output);
ls.Add(productJson);
}
}
}
foreach (String s in ls)
nopApiClient.Post(jsonUrl, s);
return RedirectToAction("GetProducts");
}
}
由于我是网络编码的新手,我是否会以错误的方式解决这个问题?是否有一种我没有遇到的批量上传的首选方式?
我试图使用 TaskCreationOptions.LongRunning 标记,这有助于原因,但不会让我接近目标。
答案 0 :(得分:0)
Web和api控制器操作并不意味着执行长时间运行的任务 - 除了锁定UI /线程之外,您将引入一系列失败的机会,您将无法从中恢复。
但是你在这里有很多选择并不是很糟糕,有很多关于异步/云架构的文献 - 它解释了如何处理文件和这些场景。
您要做的是断开文件处理与API请求(在您的应用程序而不是第三方)
这需要更多的工作,但最终会创建一个更可靠的应用程序。
第1步:
立即将文件丢弃到磁盘 - 我发现DISK上的文件已经不确定它是如何实现的,但无论哪种方式都可以解决这个问题。
第2步:
使用以
方式运行的流程
- 控制台应用程序(最简单)
- 服务(需要某种安装/卸载服务)
- 甚至是你的网络应用程序中的一个主题(但你很难知道它何时失败)
您选择哪种方式,进程将查看目录以进行文件更改,当有更改时,它将启动您的方法,以便随意处理文件。
这里查看FileSystemWatchers是一个基本示例:https://www.dotnetperls.com/filesystemwatcher
<强> 此外: 强>