从Global.asax调用SignalR的方法(MVC 3)

时间:2012-10-11 10:02:33

标签: signalr signalr-hub

我为POC创建了一个示例signalR。 我想从Global.asax调用hub方法并将字符串值传递给client。 我的消息中心是: -

[HubName("messageHub")]
public class MessageHub : Hub
{
    public static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
    public void Message()
    {

        /*
         * services and updates the messages
        * property on the PushMessage hub
        */
        //IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SignalR_Error_Logging.Models.ErrorModel>();
        List<GenerateError.Repository.ErrorModel> model = ErrorRepository.GetError();
        context.Clients.pushMessages(model[0].ErrorMessage);

    }

我在layout.cshtml中定义了两个脚本

<script type="text/javascript" src="../../Scripts/jquery-1.6.4.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.signalR-0.5.3.js"></script>

我的Index.html如下: -

    @{
    ViewBag.Title = "Receive Error message";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        var myHub = $.connection.messageHub;
        myHub.pushMessages = function (value) {
            console.log('Server called addMessage(' + value + ')');
            $("#messages").append("<li>" + value + "</li>");
        };
        $("#btnMessage").click(function () {

            myHub.message();
        });
        $.connection.hub.start().done(function () { alert("Now connected!"); }).fail(function () { alert("Could not Connect!"); });
    });

</script>
<h2>Receive Error Messages</h2>
<ul id="messages"></ul>
<input type="button" id="btnMessage" value="Get Error" />

在Global.asax中 我写了

SignalR_Error_Logging.SignalRHub.MessageHub hub = new SignalRHub.MessageHub();
        hub.Message();

在Application_Start();

我无法在我的UI中显示消息(即Index.cshtml)。

我尝试的事情: -

  • 以IIS运行应用程序。
  • 更改创建HubContext的方式。

        IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
    context.Clients.notify("Hello world");
    
  • if (Clients != null) { Clients.shootErrorMessage(message); this.Clients.shootErrorMessage(message); }

  • 通过Stackoverflow Calling SignalR hub clients from elsewhere in system

  • 的链接

任何建议???

当我通过在Index.html中创建一个按钮来调用我的hub方法时,它可以正常工作。

抱歉没有正确构建我的问题!!

2 个答案:

答案 0 :(得分:2)

我想通了,调用Hub的方式不正确。 目前我修改了我的代码,如Global.asax: -

 private void CallSignalR()
    {
        var context = SignalR.GlobalHost.ConnectionManager.GetHubContext<SignalR_Error_Logging.SignalRHub.MessageHub>();
        List<GenerateError.Repository.ErrorModel> err = GenerateError.Repository.ErrorRepository.GetError();
        foreach (var item in err)
        {
            item.ErrorDescription = item.ErrorDescription + DateTime.Now.ToString();
        }
        context.Clients.pushMessages(err);


    }

现在工作得非常好:)

仍在寻找更好的选择!!!!

答案 1 :(得分:1)

这永远不会奏效。 Global.asax中的Application_Start()仅在AppDomain的生命周期内调用一次。它发生在网站启动时,此时尚未连接任何客户端(因为网站未完全初始化),因此您无法通过SignalR发送消息。