2017-01-22 134 views
1

請幫助我!Asp.Net Web Api2 + SignalR

我有一些郵件項目。我需要使用SignalR。 現在我只有這在我啓動

app.MapSignalR(); 

我有集線器

[HubName("MailHub")] 
public class MailHub<THub>: Hub 
    where THub : IHub 
{ 
    public void SendMessage (Mail message) 
    { 
     Clients.Caller.addMessage(message); 
    } 
} 

我有MailController

[Authorize] 
[RoutePrefix("api/mail")] 
public class MailController : ApiController 

{ 

    private readonly MailStore<Mail> _mail; 

    public MailController() 
    { 
     _mail = new MailStore<Mail>(MongoUtil<Mail>.GetDefaultConnectionString()); 
    } 

    [HttpPost] 
    [Route("send")] 
    public async Task<IHttpActionResult> SendMessage(Mail message) 
    { 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<MailHub<IHub>>(); 

     if (hubContext != null) 
     { 

      if (!ModelState.IsValid) 
       return BadRequest(ModelState); 

      var currentUser = User.Identity.Name; 

      var sendMessage = new Mail 
      { 
       Subject = message.Subject, 
       Sender = message.Sender, 
       Receiver = message.Receiver, 
       Message = message.Message 
      }; 

      await _mail.CreateAsync(sendMessage); 

      // hubContext.Clients.Clien....; 

      /* if (!result.Succeeded) 
       { 
        return BadRequest(ModelState); 
       } 
       */ 
      return Ok(); 
     } 
     return BadRequest(); 
    } 
} 

以及我如何在這個控制器使用SignalR? 我需要某些用戶使用SignalR向其他用戶發送電子郵件。

+0

你的jquary代碼在哪裏? – Hadee

+0

我的工作是製作後端。 Jquary代碼將使另一個開發。 –

回答

0

嗨我改變方法是靜態的,然後我能夠調用MVC控制器classname.methodname。我想你可以做同樣的事情,請嘗試讓我知道。

 [HubName("MailHub")] 
    public class MailHub<THub>: Hub 
      where THub : IHub 
    { 
    // change to static 
    public static void SendMessage (Mail message) 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MailHub>(); 
     context.Clients.All.addMessage(message); 
    } 
} 
+0

這是錯誤 - 無法訪問非靜態屬性「客戶端」在靜態上下文 –

+0

好吧,讓我檢查。 –

+0

@OlegLyahovetskyi請立即嘗試:) –

1

看着你的代碼,你可以用和你在控制器中一樣的方式發送電子郵件。

[HubName("MailHub")] 
public class MailHub<THub>: Hub 
    where THub : IHub 
{ 
    public void SendMessage (Mail message) 
    { 
     var sendMessage = new Mail 
     { 
      Subject = message.Subject, 
      Sender = message.Sender, 
      Receiver = message.Receiver, 
      Message = message.Message 
     }; 
     await _mail.CreateAsync(sendMessage); 
    } 
} 

或者更簡單地說:

[HubName("MailHub")] 
public class MailHub<THub>: Hub 
    where THub : IHub 
{ 
    public void SendMessage (Mail message) 
    { 
     await _mail.CreateAsync(message); 
    } 
} 

有沒有內在要求的SignalR發送一個響應返回給SignalR客戶(除非你想),只是接收的參數和發送郵件,你會在控制器中。

+0

是的,但我想有很多像SendMessage,ShowAllMessages和其他方法。我如何在MailHub中獲得訪問權限?我需要一些方法來實現每種方法。還有一件事:我需要SignalR將Notofication發送給接收器!我如何做到這一點?謝謝。 –