一連の .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";