【发布时间】:2014-08-31 12:55:00
【问题描述】:
我在控制台应用程序中创建了一个简单的 SignalR 集线器:
class Program
{
static void Main(string[] args)
{
using (WebApp.Start<Startup>("http://localhost:1968"))
{
Console.WriteLine("Server running!");
Console.ReadLine();
}
}
}
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
[HubName("echo")]
public class EchoHub : Hub
{
public void Say(string message)
{
Trace.WriteLine("hub: "+message);
Clients.All.AddMessage(message);
}
public override Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected()
{
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnected();
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
当我尝试从 Silverlight 应用程序连接它时,它会成功:
static Microsoft.AspNet.SignalR.Client.HubConnection signalR { get; set; }
public static Microsoft.AspNet.SignalR.Client.IHubProxy signalRhub { get; set; }
public static void StartSignalR()
{
var url = "http://localhost:1968";
signalR = new Microsoft.AspNet.SignalR.Client.HubConnection(url);
signalR.Received += signalR_Received;
signalRhub = signalR.CreateHubProxy("echo");
signalR.Start().Wait();
signalRhub.Invoke("Say", "hub invoked");
}
我的下一步是从 jquery 连接 SignalR 集线器:
<script src="../Scripts/jquery-1.6.4.js"></script>
<script src="../Scripts/jquery.signalR-2.1.0.js"></script>
<script>
$(function ()
{
var connection = $.hubConnection("http://localhost:1968");
connection.start()
.done(function () {
console.log('connected');
connection.send("success?");
})
.fail(function (a) {
console.log('not connected'+a);
});
});
</script>
当我尝试运行这个脚本时,它给出了错误:
"XMLHttpRequest cannot load localhost:1968/signalr/negotiate?clientProtocol=1.4&_=1404978593482. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin <code>http://localhost:55282</code> is therefore not allowed access."
为什么我可以从我的 Silverlight 页面(托管在 localhost:3926)连接到集线器
并在我运行 jquery 脚本(托管在 localhost:55282)时失败?
如何才能在我的 jQuery 和 SignalR 集线器之间建立有效连接?
【问题讨论】:
-
我的猜测是这被解释为跨站点请求,因为 js 托管在与 SignalR 集线器不同的端口上。 Same Origin Policy 已生效。
-
这似乎是合理的,但为什么同样托管在不同端口上的 Silverlight 可以成功连接?如果是这样,是否可以设置 SignalR 集线器以允许交叉请求?
-
Using CORS。浏览器是罪犯。在silverlight 实现中,您使用的是我认为的.NET SignalR 客户端?
-
您可以使用 jsonp,但我会将 SignalR 移至网络服务器
-
是的,我使用的是 .NET SignalR 客户端。 Vishal Ravlani 提供的解决方案似乎有效,感谢您的回答。
标签: c# javascript jquery signalr