2012-08-28 39 views
1

我有發票進口商樞紐,像這樣:SignalR觸發事件的客戶端在MVC3

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> 

我EXPE什麼導致發生:

我期待的服務器端事件觸發,這將發送消息到客戶端, 這反過來會觸發事件來更新導入過程的狀態。

什麼似乎要發生的事情:

所有服務器端事件觸發,一切都很好。 signalR庫似乎是正確初始化的,但事件永遠不會觸發,我從來沒有將更新顯示在屏幕上。

我在做什麼錯?這是我第一次嘗試使用signalR庫,所以完全有可能我做錯了所有事情。

+0

,這有什麼區別,如果你刪除'[「進口商」]'參數,即'context.Clients .InvoiceImported(「message」);' – paul

+0

我試過了,謝謝;它似乎沒有什麼區別。 –

+0

SessionID?爲什麼要將SessionID傳遞給Groups.Add?這是錯誤的。 – davidfowl

回答

1

相信您的問題是,你的客戶端樞紐事件被命名爲使用init-帽和SignalR的默認行爲是把那些INIT-下發布到客戶端時,與常見的JavaScript約定一致。試着改變你的集線器事件註冊此:

importerHub.invoiceImported = function (message) { 

importerHub.fileImported = function (message) { 
控制器
+0

我確實改變了這一點,現在看起來事件已經發生。現在我所要做的就是弄清楚爲什麼它沒有更新我的DOM。謝謝! –