2017-01-22 14 views
1

Помогите мне, пожалуйста!Asp.Net Web Api2 + SignalR

У меня есть проект почты. Мне нужно использовать SignalR. Теперь у меня есть это только в моем запуске

app.MapSignalR(); 

I Have Hub

[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 сделает другой dev. –

ответ

0

Привет, я меняю метод на статический, и тогда мне удалось вызвать в MVC-контроллере имя класса.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

ok Позвольте мне проверить. –

+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 отправлял уведомление на приемник! Как я могу это сделать? Спасибо. –