0

我编写了这段代码来实现一个通过 HTTP 获取文件的 SSIS 控制流任务:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace HttpTask
{
    [DtsTask(
        DisplayName = "HTTP Task",
        TaskContact = "Iain Elder",
        RequiredProductLevel = DTSProductLevel.None
    )]
    public class HttpTask : Task
    {
        public string LocalPath {get; set;}
        public string Connection {get; set;}
        public bool OverwriteDestination {get; set;}

        public DTSExecResult Execute(Connections connections,
            VariableDispenser dispenser, IDTSComponentEvents events,
            IDTSLogging log, object transaction)
        {
            HttpClientConnection http = AcquireHttpConnection(connections);
            http.DownloadFile(this.LocalPath, this.OverwriteDestination);
            return DTSExecResult.Success;
        }

        private HttpClientConnection AcquireHttpConnection(Connections connections)
        {
            ConnectionManager cm = connections[this.Connection];
            object nativeConnection = cm.AcquireConnection(null);
            return new HttpClientConnection(nativeConnection);
        }
    }
}

在 Visual Studio 中,我使用此构建后脚本构建和部署我的任务,以将包复制到全局程序集缓存:

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe" /if "$(TargetPath)"
copy $(TargetFileName) "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks"

使用 Business Intelligence Development Studio 时,我可以在工具箱中看到该任务:

HTTPTask 在工具箱中可见。

当我将任务拖到设计窗口时,我看到了这个错误:

任务创建失败。

该任务不会出现在设计画布上。

我在这里做错了什么?

编辑: Siva 建议我应该用一个强名称签署程序集。我按照Benny Austin 博客上的程序集签名指南的第 1 步和第 2 步进行操作。我没有遵循其他步骤,因为我的构建后脚本为我部署了组件。

在 Visual Studio 项目属性中,我转到 Signing 选项卡并为程序集创建一个新的强名称密钥文件:

在此处输入图像描述

我保存设置并重建包。构建后脚本部署新包。

我仍然得到完全相同的错误。

4

1 回答 1

4

我能够重现您面临的问题。以下示例描述了如何重新创建问题以及如何修复它。我曾经Visual Studio 2010创建类库 DLL,但目标框架版本是 2.0。然后将控制流任务添加到SSIS 2008 R2项目中,该项目或多或少与 SSIS 2008 相同。

分步过程:

  1. 在 Visual Studio 2010 IDE 中,创建了一个 C# 类库项目并将其命名为HttpTask。请参阅屏幕截图# 1。删除了除必需的引用之外的所有引用。添加了对 DLL Microsoft.SQLServer.ManagedDTSc:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll的引用,该引用在我机器的路径中可用。根据您安装的 SQL Server 版本,路径可能会有所不同。路径中的 100 表示 SQL Server 2008 或 SQL Server 2008 R2。

  2. 将类 Program.cs 重命名为HttpTask.cs并粘贴屏幕截图 # 2中显示的代码。该代码与问题中提供的代码完全相同。代码也在C# 类代码部分下提供。

  3. 在类库项目属性上,将目标框架版本更改为.NET Framework 2.0. 参考截图# 3

  4. 如屏幕截图 # 4和 # 5所示配置构建后事件命令行。我机器上的 gacutil.exe 路径是C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe. 您的机器中的路径可能不同。该脚本还提供了Post-Build 事件命令行部分。

  5. 类库此时未签名。请参阅屏幕截图# 6

  6. 该项目已构建,但 dll 未在 GAC(全局程序集缓存)中注册。参考截图# 7

  7. 验证 DLL 是否已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\。参考截图# 8

  8. 验证 DLL存在于 GAC 文件夹C:\windows\assembly中。参考截图# 9

  9. 创建了一个新的 SSIS 包。在 SSIS 包的控制流选项卡的工具箱上,右键单击该部分Control Flow Items并选择Choose Items.... 参考截图# 10

  10. 在选择工具箱项目上,选择SSIS Control Flow Items选项卡并选择控件HTTP Task。请参阅截图 # 11

  11. 尝试将任务拖放到“控制流”选项卡上,并收到与问题中所示相同的错误。参考截图# 12。因此,上述步骤描述了如何模拟问题。现在,以下步骤描述了如何修复它。

  12. 现在,我回到类库项目并单击属性。这次我用强名称密钥签署了项目。参考截图# 13

  13. 验证强名称密钥文件已添加到项目中。参考截图# 14

  14. 建了项目。这次 DLL 已成功添加到 GAC。参考截图# 15

  15. 验证 DLL 是否已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\。参考截图# 8

  16. 验证 DLL 是否存在于 GAC 文件夹C:\windows\assembly中。参考截图# 16

  17. 在 SSIS 包上,从工具箱的控制流项部分中删除了控制 HTTP 任务。参考截图# 17

  18. 重复步骤 # 9和 # 10将任务再次添加到工具箱中。

  19. 将任务拖放到“控制流”选项卡上,任务正确显示。这次没有错误。参考截图# 18

希望有帮助。

C# 类代码:

using Microsoft.SqlServer.Dts.Runtime;

namespace HttpTask
{
    [DtsTask(
        DisplayName = "HTTP Task",
        TaskContact = "Iain Elder",
        RequiredProductLevel = DTSProductLevel.None
    )]
    public class HttpTask : Task
    {
        public string LocalPath { get; set; }
        public string Connection { get; set; }
        public bool OverwriteDestination { get; set; }

        public DTSExecResult Execute(Connections connections,
            VariableDispenser dispenser, IDTSComponentEvents events,
            IDTSLogging log, object transaction)
        {
            HttpClientConnection http = AcquireHttpConnection(connections);
            http.DownloadFile(this.LocalPath, this.OverwriteDestination);
            return DTSExecResult.Success;
        }

        private HttpClientConnection AcquireHttpConnection(Connections connections)
        {
            ConnectionManager cm = connections[this.Connection];
            object nativeConnection = cm.AcquireConnection(null);
            return new HttpClientConnection(nativeConnection);
        }
    }
}

构建后事件命令行:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe" 
/if "$(TargetPath)"
copy $(TargetFileName) 
"C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\"

截图#1:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#5:

5

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图 #11:

11

截图#12:

12

截图#13:

13

截图#14:

14

截图#15:

15

截图#16:

16

截图#17:

17

截图#18:

18

于 2011-07-14T11:15:03.223 回答