Запись SignalR при закрытии веб-страницы

Я использую запрос и ответ MassTransit с SignalR. Веб-сайт делает запрос к службе Windows, которая создает файл. Когда файл будет создан, служба Windows отправит ответное сообщение обратно на веб-сайт. Веб-сайт откроет файл и сделает его доступным для просмотра пользователями. Я хочу обработать сценарий, когда пользователь закрывает веб-страницу до создания файла. В этом случае я хочу, чтобы созданный файл был отправлен им по электронной почте.

Независимо от того, закрыл ли пользователь веб-страницу или нет, будет запущен обработчик сообщения для ответного сообщения. Что я хочу сделать, так это каким-то образом узнать в обработчике ответного сообщения, что веб-страница была закрыта. Это то, что я уже сделал. Это не работает, но иллюстрирует мои мысли. На веб-странице у меня есть

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

exportcreate — это имя моего концентратора. В setIsDisconnected я бы установил свойство для вызывающего абонента? Допустим, я успешно установил свойство, указывающее, что веб-страница закрыта. Как узнать это значение в обработчике ответного сообщения. Это то, что он делает сейчас

    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>();
    }

Я использую идентификатор корреляции сообщений в качестве группы. Сейчас для меня очень важен ExportGuid в сообщении. Это используется для идентификации файла. Поэтому, если я собираюсь отправить созданный файл по электронной почте, я должен сделать это в обработчике ответов, потому что мне нужно значение ExportGuid. Если бы я сохранил значение Caller в своем концентраторе для закрытия веб-страницы, как бы я получил к нему доступ в обработчике ответов.

На всякий случай, если вам нужно знать. отображение определяется на веб-странице как

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

GetExport.ashx открывает файл и возвращает его в качестве ответа.

Спасибо,

С уважением Бен


person Benjamin Rogers    schedule 30.04.2012    source источник


Ответы (1)


Я думаю, что лучше было бы реализовать правильную обработку соединения. В частности, пусть ваш концентратор реализует 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");
    }

Конечно, это из головы.

person JBland    schedule 29.08.2012