0

一連の .RDL ファイルを SQL Server レポート Web サービスにパブリッシュする、DTF で記述された遅延カスタム アクション DLL があります。すべてがうまく機能しており、さまざまな Try Catch ブロックでほとんどのエラー状態をトラップできます。

私が問題を抱えている唯一のことは、公開中にユーザーがインストーラーの [キャンセル] ボタンを押した場合です。インストールをキャンセルするかどうかを尋ねるメッセージがすぐにポップアップ表示されますが、「はい」と答えると、次のメッセージがスローされます。

タイプ Microsoft.Deployment.WindowsInstaller.InstallCanceledException の例外がスローされました

OKボタンだけです。

の特別な例外ハンドラーを追加しようとしました

catch (InstallCanceledException ex)
{
}

他の例外よりも前ですが、この特定の例外をキャプチャしていないようです。

長時間実行されている Deferred Custom Action のキャンセル中に InstallCanceledException を処理する方法について何か提案はありますか?

製品チームはアプリケーションの 1 つを使用することを検討しましたが、通常のユーザーがアプリケーションを実行し、Web サービスの URL を知っているとは限らず、レポートを Web サービスに公開する権限を持っているとは限りません。これを入れたインストーラーは通常、SQL スクリプトを実行するために使用され、レポートを公開するためにインストーラーに 2 つ目の機能を追加しています。それは実際にうまく機能しすぎて、今それを放棄することはできません。製品は私がすでに行ったことを見ており、彼らはそれを気に入っています. MSI プログレス バーは、公開されるたびに各レポートの名前で更新されます。MSI は URI とユーザー資格情報の入力を求めますが、.RDL ファイルが格納されているフォルダーは既に認識されています。ユーザーが [次へ] ボタンをクリックすると、URI で検証を実行するので、実行シーケンスで Deferred アクションを実行するまでに適切な URI と資格情報。私' パブリッシュが行われている間に VPN から切断すると、適切なエラーで失敗することさえありました。文字通り、ユーザーがキャンセルを押したときにのみ、それをトラップできないように見えますが、この作業が終了するのはショーストッパーでもありません。

いつでもキャンセルしても問題ないため、キャンセル ボタンを非表示にすることは適切なオプションではありません。

public static ActionResult PublishSSRSReports(Session session)
    {

        session.Log("Begin PublishSSRSReports");

        bool bFolderExists = false;

        string sCustomActionData;
        sCustomActionData = session["CustomActionData"];

        string INSTALLDIR = Convert.ToString(MsiGetCustomActionDataAttribute(sCustomActionData, "/InstallDir="));
        string SSRSURL = Convert.ToString(MsiGetCustomActionDataAttribute(sCustomActionData, "/SsrsUrl="));
        string USERCREDENTIALS = Convert.ToString(MsiGetCustomActionDataAttribute(sCustomActionData, "/Credentials="));
        string USERNAME = Convert.ToString(MsiGetCustomActionDataAttribute(sCustomActionData, "/Username="));
        string PASSWORD = Convert.ToString(MsiGetCustomActionDataAttribute(sCustomActionData, "/Password="));


        string ReportsFolderPath = INSTALLDIR + "SSRSReports";
        DirectoryInfo directory = new DirectoryInfo(ReportsFolderPath);

        FileInfo[] reports = directory.GetFiles("*.rdl"); //Getting all RDL files

        ResetProgressBar(session, reports.Length);

        CatalogItem[] catalogitem = null;

        using (ReportingService2010 rsc = new ReportingService2010())
        {

            rsc.Url = SSRSURL; 

            if (USERCREDENTIALS == "0")
            {
                rsc.Credentials = System.Net.CredentialCache.DefaultCredentials; //User credential for Reporting Service
                                                                                 //the current logged system user
            }
            if (USERCREDENTIALS == "1")
            {
                string[] userdomain = USERNAME.Split(Convert.ToChar("\\"));
                rsc.Credentials = new System.Net.NetworkCredential(userdomain[1], PASSWORD, userdomain[0]);

            }
            catalogitem = rsc.ListChildren(@"/", false);
            foreach (CatalogItem catalog in catalogitem)
            {
                if (catalog.Name == (DP))
                {
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, DP + " folder already exists");
                    bFolderExists = true;
                }
            }

            if (bFolderExists == false)
            {
                rsc.CreateFolder(DP, @"/", null);
            }

            Warning[] Warnings = null;
            foreach (FileInfo ReportFile in reports)
            {
                Byte[] definition = null;
                Warning[] warnings = null;

                try
                {
                    FileStream stream = ReportFile.OpenRead();
                    definition = new Byte[stream.Length];
                    stream.Read(definition, 0, (int)stream.Length);
                    stream.Close();
                }
                catch (InstallCanceledException ex)
                {
                    //session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Message);
                    return ActionResult.UserExit;
                }

                catch (IOException ex)
                {
                    session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Message);
                    return ActionResult.Failure;
                }
                catch (Exception ex)
                {
                    session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Message);
                    return ActionResult.Failure;
                }

                try
                {
                    CatalogItem report = rsc.CreateCatalogItem("Report", ReportFile.Name, @"/" + DP, true, definition, null, out Warnings);

                    DisplayActionData(session, ReportFile.Name);
                    IncrementProgressBar(session, 1);

                    if (report != null)
                    {
                        EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ReportFile.Name + " Published Successfully ");
                    }
                    if (warnings != null)
                    {
                        foreach (Warning warning in warnings)
                        {
                            EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, string.Format("Report: {0} has warnings", warning.Message));
                        }
                    }
                    else
                    {
                        EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, string.Format("Report: {0} created successfully with no warnings", ReportFile.Name));
                    }
                }

                catch (InstallCanceledException ex)
                {
                    //session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Message);
                    return ActionResult.UserExit;
                }

                catch (SoapException ex)
                {
                    session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Detail.InnerXml.ToString());
                    return ActionResult.Failure;
                }
                catch (Exception ex)
                {
                    session.Message(InstallMessage.Error, new Record { FormatString = ex.Message });
                    EventLog.WriteEntry(AppDomain.CurrentDomain.FriendlyName, ex.Message);
                    return ActionResult.Failure;
                }
            }

        }

        return ActionResult.Success;

私もクラスでこれらを持っています

private const string SpaceForwardSlash = " /";
    private const string DP = "Test";
4

1 に答える 1