2

私は SignalR で MassTransit リクエストとレスポンスを使用しています。Web サイトは、ファイルを作成する Windows サービスに要求を行います。ファイルが作成されると、Windows サービスは応答メッセージを Web サイトに送り返します。Web サイトはファイルを開き、ユーザーが表示できるようにします。ファイルが作成される前にユーザーが Web ページを閉じるシナリオを処理したいと考えています。その場合、作成したファイルをメールで送信したいと思います。

ユーザーが Web ページを閉じたかどうかに関係なく、応答メッセージのメッセージ ハンドラーが実行されます。私ができるようにしたいのは、Web ページが閉じられたことを応答メッセージ ハンドラー内で知る方法があることです。これは私がすでに行ったことです。うまくいきませんが、私の考えを説明しています。私が持っているウェブページで

$(window).unload(function () {
            if (event.clientY < 0) {
                // $.connection.hub.stop();
                $.connection.exportcreate.setIsDisconnected();
    }
});

exportcreate は私のハブ名です。setIsDisconnected では、Caller にプロパティを設定しますか? Web ページが閉じられたことを示すプロパティの設定に成功したとします。応答メッセージ ハンドラーでその値を確認するにはどうすればよいですか。これが現在の動作です

    protected void BasicResponseHandler(BasicResponse message)
    {
        string groupName = CorrelationIdGroupName(message.CorrelationId);

        GetClients()[groupName].display(message.ExportGuid);
    }

    private static dynamic GetClients()
    {
        return AspNetHost.DependencyResolver.Resolve<IConnectionManager>().GetClients<ExportCreateHub>();
    }

メッセージ相関 ID をグループとして使用しています。私にとって、メッセージの ExportGuid は非常に重要です。これは、ファイルを識別するために使用されます。したがって、作成したファイルを電子メールで送信する場合は、ExportGuid 値が必要なため、応答ハンドラー内で実行する必要があります。Web ページを閉じるためにハブの Caller に値を保存した場合、応答ハンドラーでどのようにアクセスしますか。

念のため、知っておく必要があります。表示は Web ページで次のように定義されます。

            exportCreate.display = function (guid) {
                setTimeout(function () {
                    top.location.href = 'GetExport.ashx?guid=' + guid;
                }, 500);
            };

GetExport.ashx はファイルを開き、それを応答として返します。

ありがとうございました、

よろしくベン

4

1 に答える 1

3

適切な接続処理を実装するのがより良い方法だと思います。具体的には、ハブにIDisconnectとIConnectedを実装してもらいます。次に、connectionIdをドキュメントGuidにマッピングします。

    public Task Connect()
    {
        connectionManager.MapConnectionToUser(Context.ConnectionId, Context.User.Name);
    }

    public Task Disconnect()
    {
        var connectionId = Context.ConnectionId;
        var docId = connectionManager.LookupDocumentId(connectionId);
        if (docId != Guid.Empty) 
        {
           var userName = connectionManager.GetUserFromConnectionId(connectionId);
           var user = userRepository.GetUserByUserName(userName);
           bus.Publish( new EmailDocumentToUserCommand(docId, user.Email));
        }
    }

    // Call from client
    public void GenerateDocument(ClientParameters docParameters) 
    {
        var docId = Guid.NewGuid();
        connectionManager.MapDocumentIdToConnection(Context.ConnectionId, docId);
        var command = new CreateDocumentCommand(docParameters);
        command.Correlationid = docId;
        bus.Publish(command);
        Caller.creatingDocument(docId);
    }

    // Acknowledge you got the doc.
    // Call this from the display method on the client.
    // If this is not called, the disconnect method will handle sending
    // by email.
    public void Ack(Guid docId) 
    {          
       connectionManager.UnmapDocumentFromConnectionId(connectionId, docId);
       Caller.sendMessage("ok");
    }

もちろん、これは私の頭のてっぺんからです。

于 2012-08-29T21:35:42.917 に答える