通过REST api批量上传

时间:2017-11-27 00:09:02

标签: c# asp.net-mvc rest

我的目标是将约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 标记,这有助于原因,但不会让我接近目标。

1 个答案:

答案 0 :(得分:0)

Web和api控制器操作并不意味着执行长时间运行的任务 - 除了锁定UI /线程之外,您将引入一系列失败的机会,您将无法从中恢复。

但是你在这里有很多选择并不是很糟糕,有很多关于异步/云架构的文献 - 它解释了如何处理文件和这些场景。

您要做的是断开文件处理与API请求(在您的应用程序而不是第三方)

这需要更多的工作,但最终会创建一个更可靠的应用程序。

第1步:

立即将文件丢弃到磁盘 - 我发现DISK上的文件已经不确定它是如何实现的,但无论哪种方式都可以解决这个问题。

第2步:

使用以
方式运行的流程 - 控制台应用程序(最简单)
- 服务(需要某种安装/卸载服务)
- 甚至是你的网络应用程序中的一个主题(但你很难知道它何时失败)

您选择哪种方式,进程将查看目录以进行文件更改,当有更改时,它将启动您的方法,以便随意处理文件。

这里查看FileSystemWatchers是一个基本示例:https://www.dotnetperls.com/filesystemwatcher

<强> 此外: