我的ASP.NET网站上有一个非常基本的SignalR配置设置。我可以调用服务器并在所有连接的客户端上调用一些方法。但其他方法似乎不起作用,我得到以下错误。
500:'XXX'方法无法解决。
我认为服务器和客户端之间可能存在冲突的方法名称,但我很难相信。需要注意的一点是,对于调用带参数的客户端方法的方法,它确实失败了。这是我的代码:
服务器端
<HubName("myHub")>
Public Class myHub
Inherits Hub
Public Sub sendMsg(ByVal message As String, ByVal Optional target As String = "")
Clients.All.invoke_message(Context.ConnectionId, message)
End Sub
Public Sub refresh()
Clients.All.invoke_refresh()
End Sub
End Class
客户端
window.myHub = $.connection.myHub;
myHub.client.invoke_refresh = function () {
// invoked to force the user's page to refresh
document.location.reload(true);
}
myHub.client.invoke_message = function (clientID, message) {
// invoked while broadcasting a message
console.log(clientID + ': ' + message);
};
刷新方法正常。新消息返回上述错误。
有什么想法?提前谢谢。
答案 0 :(得分:1)
在SignalR中,服务器不了解任何JS客户端功能。它只向客户端发送消息,客户端调用给定的函数(如果存在)。
因此,您看到500错误(内部服务器错误)这一事实让我相信它与客户无关。
话虽如此,我继续用C#测试了你的代码,它运行良好。还做了一个VB.Net项目,最后让它正常工作。
这是我的VB.Net项目的代码:
服务器中心(MyHub.vb)
Imports Microsoft.AspNet.SignalR.Hubs
<HubName("myHub")>
Public Class MyHub
Inherits Hub
Public Sub sendMsg(ByVal message As String)
Clients.All.invoke_message(Context.ConnectionId, message)
End Sub
Public Sub refresh()
Clients.All.invoke_refresh()
End Sub
End Class
客户端代码(default.aspx):
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="default.aspx.vb" Inherits="VBTest._default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div id="SendMessage">SendMsg</div>
<div id="Refresh">Refresh</div>
</div>
</form>
<script src="Scripts/jquery-1.6.4.js"></script>
<script src="Scripts/jquery.signalR-1.0.0-rc1.js"></script>
<script src="/signalr/hubs"></script>
<script type="text/javascript">
window.myHub = $.connection.myHub;
myHub.client.invoke_refresh = function () {
// invoked to force the user's page to refresh
document.location.reload(true);
}
myHub.client.invoke_message = function (clientID, message) {
// invoked while broadcasting a message
console.log(clientID + ': ' + message);
};
$.connection.hub.start().done(function () {
$("#SendMessage").click(function () {
window.myHub.server.sendMsg("ELLO");
});
$("#Refresh").click(function () {
window.myHub.server.refresh();
});
});
</script>
</body>
</html>
<强>的Global.asax:强>
Imports System.Web.SessionState
Imports System.Web.Routing
Imports Microsoft.AspNet.SignalR
Public Class Global_asax
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RouteTable.Routes.MapHubs()
End Sub
End Class
我文件夹结构的SS: http://imgur.com/hpCQC
确保删除App_Start代码并将其替换为Global.asax代码。
我做的另一件事是我从源代码中获取了所有的SignalR代码(https://github.com/SignalR/SignalR/tree/release)。
希望这有帮助!
答案 1 :(得分:1)
这感觉有点傻。在升级过程中,SignalR打破了处理带有可选参数的服务器端方法的能力,并且在不传递这些可选参数的情况下被调用。 See the issue here。
作为从~v0.53升级到v1.0的任何人的注释,这是值得注意的。