我为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)。
我尝试的事情: -
更改创建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方法时,它可以正常工作。
抱歉没有正确构建我的问题!!
答案 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发送消息。