1

次のような請求書インポーターハブがあります。

public class ImporterHub : Hub, IDisconnect, IConnected
{

    public void InvoiceImported(InvoiceImportedMessage message)
    {
        Clients["importer"].InvoiceImported(message);
    }

    public void FileImported(FileImportedMessage message)
    {
        Clients["importer"].FileImported(message);
    }

    public System.Threading.Tasks.Task Disconnect()
    {
        return Clients["importer"].leave(Context.ConnectionId, DateTime.Now.ToString());
    }

    public System.Threading.Tasks.Task Connect()
    {
        return Clients["importer"].joined(Context.ConnectionId, DateTime.Now.ToString());
    }

    public System.Threading.Tasks.Task Reconnect(IEnumerable<string> groups)
    {
        return Clients["importer"].rejoined(Context.ConnectionId, DateTime.Now.ToString());
    }
}

私のコントローラーでは、次のように長時間実行されるインポート プロセスのイベントをキャプチャしています。

    [HttpPost]
    public ActionResult Index(IndexModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                model.NotificationRecipient = model.NotificationRecipient.Replace(';', ',');
                ImportConfiguration config = new ImportConfiguration()
                {
                    BatchId = model.BatchId,
                    ReportRecipients = model.NotificationRecipient.Split(',').Select(c => c.Trim())
                };
                var context = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
                context.Groups.Add(this.Session.SessionID, "importer");
                System.Threading.ThreadPool.QueueUserWorkItem(foo => LaunchFileImporter(config));
                Log.InfoFormat("Queued the ImportProcessor to process invoices.  Send Notification: {0} Email Recipient: {1}",
                    model.SendNotification, model.NotificationRecipient);
                TempData["message"] = "The import processor job has been started.";
                //return RedirectToAction("Index", "Home");
            }
            catch (Exception ex)
            {
                Log.Error("Failed to properly queue the invoice import job.", ex);
                ModelState.AddModelError("", ex.Message);
            }
        }

    private void LaunchFileImporter(ImportConfiguration config)
    {
        using (var processor = new ImportProcessor())
        {
            processor.OnFileProcessed += new InvoiceFileProcessing(InvoiceFileProcessingHandler);
            processor.OnInvoiceProcessed += new InvoiceSubmitted(InvoiceSubmittedHandler);
            processor.Execute(config);
        }
    }

    private void InvoiceSubmittedHandler(object sender, InvoiceSubmittedEventArgs e)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
        var message = new InvoiceImportedMessage()
        {
            FileName = e.FileName,
            TotalErrorsInFileProcessed = e.TotalErrors,
            TotalInvoicesInFileProcessed = e.TotalInvoices
        };
        context.Clients["importer"].InvoiceImported(message);
    }
    private void InvoiceCollectionSubmittedHandler(object sender, InvoiceCollectionSubmittedEventArgs e)
    {
    }
    private void InvoiceFileProcessingHandler(object sender, InvoiceFileProcessingEventArgs e)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
        var message = new FileImportedMessage()
        {
            FileName = e.FileName
        };
        context.Clients["importer"].FileImported(message);
    }

インポーターのビューには次のスクリプトがあります。

<script type="text/javascript">
    jQuery.connection.hub.logging = true;
    var importerHub = jQuery.connection.importerHub;

    importerHub.InvoiceImported = function (message) {
        jQuery('#' + message.FileName + '_Invoices').text(message.TotalInvoicesInFileProcessed);
        jQuery('#' + message.FileName + '_Errors').text(message.TotalErrorsInFileProcessed);
    };

    importerHub.FileImported = function (message) {
        jQuery('#' + message.FileName + '_Processed').text('Done');
    };

    jQuery.connection.hub.start();
</script>

私が期待したこと:

サーバー側のイベントがトリガーされ、クライアントにメッセージが送信され、クライアントがイベントを起動して、インポート プロセスのステータスを更新することを期待していました。

何が起こっているようですか:

すべてのサーバー側イベントがトリガーされます。すべて問題ありません。signalR ライブラリは適切に初期化されているようですが、イベントが発生することはなく、画面に更新が表示されることもありません。

私は何を間違っていますか?これは signalR ライブラリを使用する最初の試みであるため、すべてが間違っている可能性があります。

4

1 に答える 1

1

あなたの問題は、クライアント側のハブ イベントに init-caps という名前が付けられており、SignalR の既定の動作は、クライアントに発行するときにそれらを init-lower に変換して、一般的な JavaScript 規則に合わせることだと思います。ハブ イベントの登録を次のように変更してみてください。

importerHub.invoiceImported = function (message) { 

importerHub.fileImported = function (message) {
于 2012-08-28T16:29:57.793 に答える