【发布时间】:2017-02-08 08:34:22
【问题描述】:
我正在尝试创建一个简单的 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 控制台窗口中得到以下输出:
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 脚本!
【问题讨论】:
-
一个简单的问题,这两个代码都在同一个项目或两个不同的项目中,因为 IMO 一个似乎是基于控制台的应用程序,另一个是基于 Web 的。这是正确的吗?
-
是的 - 单独的应用程序。用于发送消息的控制台应用程序和用于显示消息的 Web 应用程序
-
允许 CORS 也很重要。见docs.microsoft.com/en-us/aspnet/signalr/overview/…
-
我认为 CORS 仅在您跨域时才相关?
-
@Tester 在他的评论中已经提到启用 CORS,这样您就可以将消息从控制台应用程序发送到 Web 应用程序。由于您处于开发阶段并且项目具有不同的端口号,因此您必须在当前应用程序中实现 CORS。如果您打算将它们托管在单个域中(我假设您会这样做),则不需要 CORS 继续您的工作并在 LIVE 站点上对其进行测试。
标签: c# asp.net-mvc signalr signalr-hub