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 が表示されます。

タスクをデザイン ウィンドウにドラッグすると、次のエラーが表示されます。

タスクの作成に失敗します。

タスクはデザイン キャンバスに表示されません。

ここで私は何を間違えましたか?

編集:シヴァは、厳密な名前でアセンブリに署名する必要があることを提案しました。Benny Austin のブログにあるアセンブリに署名するためのガイドの手順 1 と 2 に従いました。ビルド後のスクリプトがコンポーネントをデプロイするため、他の手順は実行しませんでした。

Visual Studio プロジェクトのプロパティで、[署名] タブに移動し、アセンブリ用の新しい厳密な名前のキー ファイルを作成します。

ここに画像の説明を入力

設定を保存し、パッケージを再構築します。ビルド後のスクリプトが新しいパッケージをデプロイします。

私はまだまったく同じエラーが発生します。

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.ManagedDTSへの参照を追加しました。c:\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. お使いのマシンではパスが異なる場合があります。スクリプトには、ビルド後のイベント コマンド ラインセクションも用意されています。

  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 パッケージを作成しました。Control Flow ItemsSSIS パッケージの [制御フロー] タブのツール ボックスで、セクションを右クリックしてChoose Items.... スクリーンショット # 10を参照してください。

  10. [ツールボックス アイテムの選択] で、SSIS Control Flow Itemsタブを選択し、コントロールHTTP タスクを選択します。スクリーンショット # 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. 手順910を繰り返して、タスクをツールボックスに再度追加します。

  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 に答える