C# 从SSIS调用操作MVC与直接在脚本任务SSIS中执行代码

C# 从SSIS调用操作MVC与直接在脚本任务SSIS中执行代码,c#,sql-server,asp.net-mvc,ssis,C#,Sql Server,Asp.net Mvc,Ssis,我需要每月启动一次创建预格式化文本文件的过程。数据源位于数据库表中(sql server 2008 R2)。 有必要对数据执行一些逻辑(ETL),然后写入txt文件 我找到了两个解决方案 第一种方法是:使用一个计划SSI,在其中提取、转换脚本任务(c#)中的逻辑数据,并将结果转储到txt文件中 第二个解决办法是: 我可以将SSIS与脚本任务一起使用,只调用动作MVC(c#代码并使用WebClient.UploadData)。 数据提取、转换和结果转储在txt文件中完全由MVC操作执行。 我认为最

我需要每月启动一次创建预格式化文本文件的过程。数据源位于数据库表中(sql server 2008 R2)。 有必要对数据执行一些逻辑(ETL),然后写入txt文件

我找到了两个解决方案

第一种方法是:使用一个计划SSI,在其中提取、转换脚本任务(c#)中的逻辑数据,并将结果转储到txt文件中

第二个解决办法是: 我可以将SSIS与脚本任务一起使用,只调用动作MVC(c#代码并使用WebClient.UploadData)。 数据提取、转换和结果转储在txt文件中完全由MVC操作执行。 我认为最好在MVC行动中移动逻辑,以实现以下优点:

  • 测试驱动开发

  • 日志记录(使用log4net)

  • 实体框架

  • 重用WebApp的代码逻辑

  • 未来的sql server迁移可能会更简单(dtsx迁移),因为逻辑在SSI之外

如果所有的应用程序逻辑都在WebApp中,我会更有信心:我更喜欢只在大型ETL中使用SSI

第二种解决方案的缺点是有必要对MVC操作调用执行安全管理,以避免恶意调用

问题

你认为什么是最好的解决方案


SSI内部或外部(WebApp MVC)逻辑?

我面临同样的问题。我选择将逻辑放在ASP.NET web应用程序中,原因与您列出的相同。

我的建议是考虑使用。我认为它是为这种情况而设计的。 也就是说,您始终可以使用SSI调用MVC操作。出于安全原因,我建议将其作为https上的post请求,并提供某种类型的身份验证。如果这是一个长时间运行的过程,您可能需要扩展webClient以延长时间。以下代码的功劳归于

用法: 使用(var client=new LocalWebClient())
{}

方案一很复杂。方案二非常复杂。使用任何您可以支持的工具构建它。我建议您根本不要使用SSI。只需使用其他工具,即可按计划直接执行web应用程序。从windows scheduler中,您可以使用CURL.EXE()或VBScript(),也可以使用类似的方法在IIS中构建您的计划程序。不要因为您正在执行数据提取而认为您必须使用SSIS。它也有它自己的复杂性。例如,您首先需要一个特殊且极其困难的工具(SSDT)来构建包。只需在您熟悉的工具(ASP.Net)中构建它,然后在需要时使用windows scheduler调用它。谢谢@Nick.McDermaid,我更喜欢使用类似SSIS的启动器,因为我希望管理计划进程的列表。然后我需要将SSI置于版本控制(TFS)之下。有了windows调度器,我就失去了这个优势。你可以将任何脚本或文件置于版本控制之下。对于curl示例,您在一个web服务(在版本控制中)中编写所有实际逻辑,并使用curl(使用脚本,也在版本控制下)调用它,如果您愿意,您可以编写windows调度程序定义的脚本,并将其也置于版本控制下。我想说的是,如果您有一个SSIS包,它只包含一个脚本任务,那么SSIS是错误的工具
public class LocalWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest w = base.GetWebRequest(uri);
        w.Timeout = 10 * 60 * 1000;//10 minutes
        return w;
    }
}