Signalr 测试项目未按预期工作
Signalr Test Project Not Working As Expected
我正在尝试创建一个简单的 SignalR 测试项目;但是,它并没有按照我认为应该的方式运行。我有一个包含以下代码的网站:
namespace SignalRTest3
{
public class MyHub1 : Hub
{
public void Hello(string message)
{
Clients.All.Hello();
}
}
}
Startup.cs:
[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))]
namespace SignalRTest3
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
}
我已经更改了索引页:
<body>
<!-- HTML Content -->
<script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
<script type="text/javascript" src="~/signalr/hubs"></script>
<script type="text/javascript" src="~/Scripts/SignalRTest.js"></script>
<div class="jumbotron">
<h1>SignalR Test</h1>
</div>
</body>
而上面引用的JS文件是:
$(function () {
// Declare a proxy to reference the hub.
var hub = $.connection.MyHub1;
// Create a function that the hub can call to broadcast messages.
hub.client.Hello = function (message) {
alert(message);
};
hub.start();
});
因此,本意是当收到通知时,网站将显示警报。要触发它,我有一个控制台应用程序:
class Program
{
static void Main(string[] args)
{
Console.Write("Message: ");
string message = Console.ReadLine();
HubConnection connection = new HubConnection("http://localhost:4035/");
IHubProxy hub = connection.CreateHubProxy("MyHub1");
connection.Start().Wait();
hub.Invoke<string>("Hello", message).Wait();
}
}
所以我输入了一条消息,可以看到集线器中的代码触发了,但是 javascript 和集线器之间的接线似乎有问题;请有人能指出我正确的方向吗?
编辑:根据 JPThorne 的建议更改方法签名和 hub.start
编辑:尝试使用 CORS,但无济于事
看起来问题可能出在代理上;我在 F12 控制台中得到以下输出 window:
Uncaught TypeError: Cannot read property 'MyHub1' of undefined
at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3)
at c (jquery-1.10.2.min.js:21)
at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21)
at Function.ready (jquery-1.10.2.min.js:21)
at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21
更新:
感谢JPThorne的帮助,我终于找到了BundleConfig文件;我的看起来像这样:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
// Use the development version of Modernizr to develop with and learn from. Then, when you're
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
"~/Scripts/modernizr-*"));
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js"));
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));
据我所知,~/Scripts/jquery-{version}.js
上用于 {version} 的正则表达式也过早地选择了 SignalR 脚本!
您还需要在客户端启动集线器。嗯,这对我们有用。你可以试试这个:
$.connection.hub
.start()
.done(function() { console.log("Hub started"); })
.fail(function() { console.log("Error: could not connect"); });
此外,我发现以下侦听器非常方便:
$.connection.hub.connectionSlow(function() {
console.log("We are currently experiencing difficulties with the connection.");
});
$.connection.hub.error(function (error) {
console.log("SignalR error: ", error);
});
更新 #1:
我会将您服务器上的 Clients.All.hello();
更改为 Clients.All.hello(message);
然后在 FE 上将 hub.client.Hello = function (name, message)
更改为 hub.client.Hello = function (message)
更新#2:
添加 :
[HubName("MyHub1")]
以上 public class MyHub1 : Hub
更新 #3:
好的,我试过你的版本,实际上有一些问题。
- 不要这样调用开始:
hub.start();
这样调用:$.connection.hub.start();
- 您可能想要升级到最新版本的 jquery。
- 确保您在 SignalRTest.js 上方引用 jquery - 这就是为什么您在上方出现 'cannot read property of undefined' 错误的原因。
我正在尝试创建一个简单的 SignalR 测试项目;但是,它并没有按照我认为应该的方式运行。我有一个包含以下代码的网站:
namespace SignalRTest3
{
public class MyHub1 : Hub
{
public void Hello(string message)
{
Clients.All.Hello();
}
}
}
Startup.cs:
[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))]
namespace SignalRTest3
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
}
我已经更改了索引页:
<body>
<!-- HTML Content -->
<script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
<script type="text/javascript" src="~/signalr/hubs"></script>
<script type="text/javascript" src="~/Scripts/SignalRTest.js"></script>
<div class="jumbotron">
<h1>SignalR Test</h1>
</div>
</body>
而上面引用的JS文件是:
$(function () {
// Declare a proxy to reference the hub.
var hub = $.connection.MyHub1;
// Create a function that the hub can call to broadcast messages.
hub.client.Hello = function (message) {
alert(message);
};
hub.start();
});
因此,本意是当收到通知时,网站将显示警报。要触发它,我有一个控制台应用程序:
class Program
{
static void Main(string[] args)
{
Console.Write("Message: ");
string message = Console.ReadLine();
HubConnection connection = new HubConnection("http://localhost:4035/");
IHubProxy hub = connection.CreateHubProxy("MyHub1");
connection.Start().Wait();
hub.Invoke<string>("Hello", message).Wait();
}
}
所以我输入了一条消息,可以看到集线器中的代码触发了,但是 javascript 和集线器之间的接线似乎有问题;请有人能指出我正确的方向吗?
编辑:根据 JPThorne 的建议更改方法签名和 hub.start
编辑:尝试使用 CORS,但无济于事
看起来问题可能出在代理上;我在 F12 控制台中得到以下输出 window:
Uncaught TypeError: Cannot read property 'MyHub1' of undefined
at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3)
at c (jquery-1.10.2.min.js:21)
at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21)
at Function.ready (jquery-1.10.2.min.js:21)
at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21
更新:
感谢JPThorne的帮助,我终于找到了BundleConfig文件;我的看起来像这样:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
// Use the development version of Modernizr to develop with and learn from. Then, when you're
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
"~/Scripts/modernizr-*"));
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js"));
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));
据我所知,~/Scripts/jquery-{version}.js
上用于 {version} 的正则表达式也过早地选择了 SignalR 脚本!
您还需要在客户端启动集线器。嗯,这对我们有用。你可以试试这个:
$.connection.hub
.start()
.done(function() { console.log("Hub started"); })
.fail(function() { console.log("Error: could not connect"); });
此外,我发现以下侦听器非常方便:
$.connection.hub.connectionSlow(function() {
console.log("We are currently experiencing difficulties with the connection.");
});
$.connection.hub.error(function (error) {
console.log("SignalR error: ", error);
});
更新 #1:
我会将您服务器上的 Clients.All.hello();
更改为 Clients.All.hello(message);
然后在 FE 上将 hub.client.Hello = function (name, message)
更改为 hub.client.Hello = function (message)
更新#2:
添加 :
[HubName("MyHub1")]
以上 public class MyHub1 : Hub
更新 #3:
好的,我试过你的版本,实际上有一些问题。
- 不要这样调用开始:
hub.start();
这样调用:$.connection.hub.start();
- 您可能想要升级到最新版本的 jquery。
- 确保您在 SignalRTest.js 上方引用 jquery - 这就是为什么您在上方出现 'cannot read property of undefined' 错误的原因。