SignalR无法读取未定义的属性客户端
我试图添加SignalR到我的项目(ASPNET MVC 4)。 但是我不能使它工作。
在下面的图片中,你可以看到我收到的错误。 我读过很多的stackoverflow的post,但他们都没有解决我的问题。
这是我迄今为止所做的:
1) Ran Install-Package Microsoft.AspNet.SignalR -Pre 2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start() 3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content 4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config 5) Created folder Hubs in the root of the MVC application 6) Moved jquery and signalR scripts to /Scripts/lib folder (I'm not using jquery 1.6.4, I'm using the latest)
这是我的Index.cshtml
<h2>List of Messages</h2> <div class="container"> <input type="text" id="message" /> <input type="button" id="sendmessage" value="Send" /> <input type="hidden" id="displayname" /> <ul id="discussion"> </ul> </div> @section pageScripts { <!--Reference the SignalR library. --> <script src="@Url.Content("~/Scripts/jquery.signalR-1.0.0-rc1.min.js")" type="text/javascript"></script> <!--Reference the autogenerated SignalR hub script. --> <script type="text/javascript" src="~/signalr/hubs"></script> <script src="@Url.Content("~/Scripts/map.js")" type="text/javascript"></script> }
这是我的IServerHub.cs文件(位于Hubs文件夹内)
namespace Gdp.IServer.Ui.Web.Hubs { using Microsoft.AspNet.SignalR.Hubs; [HubName("iServerHub")] public class IServerHub : Hub { public void Send(string name, string message) { Clients.All.broadcastMessage(name, message); } } }
这是map.js
$(function () { // Declare a proxy to reference the hub. var clientServerHub = $.connection.iServerHub; // Create a function that the hub can call to broadcast messages. clientServerHub.client.broadcastMessage = function (name, message) { $('#discussion').append('<li><strong>' + name + '</strong>: ' + message + '</li>'); }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Html encode display name and message. var encodedName = $('<div />').text($('#displayname').val()).html(); var encodedMsg = $('<div />').text($('#message').val()).html(); // Call the Send method on the hub. clientServerHub.server.send(encodedName, encodedMsg); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); });
我看到的SignalR的引用是:
- Microsoft.AspNet.SignalR.Core
- Microsoft.AspNet.SignalR.Owin
- Microsoft.AspNet.SignalR.SystemWeb
任何想法如何得到它的工作? 我应该做任何改变,因为脚本在/脚本/ lib文件夹?
注意我正在按照这里find的有关如何设置Windsor Castle来使其与SignalR一起工作的指令,并且似乎代理服务器无法创build,并且出现同样的错误:
Cannot read property client of undefined
这意味着集线器的代理没有被创build
这是我如何在服务器中
public class IncidentServerHub : Hub
并在客户端这样
var clientServerHub = $.connection.incidentServerHub;
再次,我可以在这里看到dynamic创build的文件:
/GdpSoftware.Server.Web/signalr/hubs
那么,为什么代理没有被创build?
提前致谢!!! 吉列尔莫。
我通过更改我的js代码解决了这个问题: var myHub = $.connection.SentimentsHub;
到var myHub = $.connection.sentimentsHub;
所以如果你有一个类名为TestHub的集线器,你必须在js中使用testHub(第一个字母是小写)
对于试图在软件包中添加生成的代理文件path的用户。
不要在你的BundleConfig.cs中包含“〜/ signalr / hubs” 。
你可以在包中包含JQuery.SignalR :
bundles.Add(new ScriptBundle("~/bundles/signalr").Include( "~/Scripts/jquery.signalR-{version}.js"));
但是你需要在你的视图中添加“/ signalr / hubs”
@section Scripts { @Scripts.Render("~/bundles/signalr") @Scripts.Render("/signalr/hubs") }
我希望这有帮助。
我有相同的错误信息,并通过修复我在Hub类的[HubName]属性中的拼写错误来解决问题 – 它不完全匹配客户端JavaScript中的属性。
C#集线器类:
[HubName("gameHub")] public class GameHub : Hub {
客户端javascript:
var foo = $.connection.gameHub;
“gameHub”必须相同。
心连心
对于ASP.Net MVC的人:
检查你的_Layout.cshtml
如果您在“@RenderBody()”之后调用jquery包,则会出现此错误。
解决方法:只需将“@ Scripts.Render(”〜/ bundles / jquery“)”移动到头部分, 或者在脚本“部分”中写入所有的signalr脚本
您的中心课程必须定义为公开的。 例如:
class ChatHub : Hub
实际上应该是
public class ChatHub : Hub
好的,我发现了这个问题,我需要做的一件事是:
这两个引用缺失:
Microsoft.AspNet.SignalR.Hosting.AspNet Microsoft.AspNet.SignalR.Hosting.Common
现在,我包括他们得到Nuget包:WebApiDoodle.SignalR使用这两个。 我的问题是为什么这些Dll没有添加一个我安装的Nuget包:Microsoft.AspNet.SignalR -Pre?
错误?
然后我在我的global.asax.cs中有这个
using SignalR;
所以
RouteTable.Routes.MapHubs();
正在使用那个,我需要删除使用和使用这一个:
using Microsoft.AspNet.SignalR;
所以MapHubs使用那个,并开始工作。
希望这可以帮助别人。 吉列尔莫。
让集线器类“公开”为我解决。
您应该按照正确的顺序放置SignalR和jQuery脚本:
<script src="/Scripts/jquery-1.6.4.min.js" ></script> <script src="/Scripts/jquery.signalR-1.1.4.js"></script> <script src="/signalr/hubs"></script>