1

クラウド データベースに対してライセンス キーをチェックする CustomAction があります。これは、非同期メソッドを使用して、続行する前に応答を待ちます。

CustomAction の外で以下のメソッドをテストすると、正常に動作します。リクエストを送信し、タスクが完了するまで待機し、結果を返します。

CustomAction で同じメソッドを使用すると、(デバッグを使用して) t.Wait() 行にヒットするとすぐに、ダイアログが即座に「途中で終了しました」ページに移動することがわかります。

不足しているものはありますか、それともタスク (特に非同期タスクを待機中) は CustomActions では不可能ですか?

[CustomAction]
public static ActionResult LicenseCheck(Session session)
{
#if DEBUG
    System.Diagnostics.Debugger.Launch();
#endif
    // Default Values
    ReturnActionResult = ActionResult.Success;
    session["PIDACCEPTED"] = "0";

    string key = session["PIDKEY"].Replace("-", "");

    IEnumerable<ParseObject> results = ParseCustom.StartQueryRequest("Store", "Key", key);

    // Not making it past this point

...

public static class ParseCustom
{

    public static IEnumerable<ParseObject> StartQueryRequest(string className, string key, string value)
    {
        Task<IEnumerable<ParseObject>> t = DoWorkAsync(className, key, value);
        t.Wait(); // Hitting this line in CustomAction causes instant Failure, doesnt get past this line
        return t.Result;
    }

    private static Task<IEnumerable<ParseObject>> DoWorkAsync(string className, string key, string value)
    {
        return Task<IEnumerable<ParseObject>>.Factory.StartNew(() =>
        {
            var x = AsyncTaskHelper(className, key, value);
            return x.Result;
        });
    }

    private static Task<IEnumerable<ParseObject>> AsyncTaskHelper(string className, string key, string value)
    {
        return Task.Run(async () =>
        {
            IEnumerable<ParseObject> ParseResults = await AccessParseAsync(className, key, value);
            return ParseResults;
        });
    }

    private static async Task<IEnumerable<ParseObject>> AccessParseAsync(string className, string key, string value)
    {
        ParseQuery<ParseObject> query = ParseObject.GetQuery(className).WhereEqualTo(key, value);
        IEnumerable<ParseObject> parseResults = await query.FindAsync();
        return parseResults;
    }
}

一時ログ:

MSI (c) (0C:BC) [09:24:13:569]: Doing action: LicenseCheckAction
Action 9:24:13: LicenseCheckAction. 
Action start 9:24:13: LicenseCheckAction.
MSI (c) (0C:04) [09:24:13:591]: Invoking remote custom action. DLL: C:\Users\dirt\AppData\Local\Temp\MSIFF5.tmp, Entrypoint: LicenseCheck
MSI (c) (0C:F0) [09:24:13:592]: Cloaking enabled.
MSI (c) (0C:F0) [09:24:13:592]: Attempting to enable all disabled privileges before calling Install on Server
MSI (c) (0C:F0) [09:24:13:592]: Connected to service for CA interface.
MSI (c) (0C!A4) [09:24:16:819]: PROPERTY CHANGE: Adding PIDACCEPTED property. Its value is '0'.
Action ended 9:24:16: LicenseCheckAction. Return value 3.
DEBUG: Error 2896:  Executing action LicenseCheckAction failed.
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2896. The arguments are: LicenseCheckAction, , 
Action ended 9:24:16: WelcomeDlg. Return value 3.
MSI (c) (0C:BC) [09:24:16:873]: Doing action: FatalError
Action 9:24:16: FatalError. 
Action start 9:24:16: FatalError.
Action 9:24:16: FatalError. Dialog created
Action ended 9:32:02: FatalError. Return value 2.
Action ended 9:32:02: INSTALL. Return value 3.
MSI (c) (0C:BC) [09:32:02:489]: Destroying RemoteAPI object.
MSI (c) (0C:F0) [09:32:02:489]: Custom Action Manager thread ending.
4

1 に答える 1

0

これは WiX とは何の関係もありませんでした。問題は CustomAction コード自体にあり、何かを適切に初期化していませんでした。

@Stephan Cleary のリマインダーのおかげで、コードをtry catchブロックに入れて、欠落していた例外の詳細を知ることができました。

于 2013-10-14T12:21:55.903 に答える