ho creato un semplice hub SignalR all'interno di un'applicazione di console:connettersi a signalr hub
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();
}
}
Quando provo a collegare questo da un App Silverlight, ci riesce:
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");
}
Il mio prossimo passo è quello di collegare l'hub SignalR da jquery:
<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>
Quando provo ad eseguire questo script, dà l'errore:
"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."
Perché posso collegare al mozzo dalla mia pagina Silverlight (ospitato in localhost: 3926)
e non riesce quando si esegue il script jquery (ospitato in localhost: 55282)?
Cosa posso fare per ottenere una connessione funzionante tra il mio hub jQuery e SignalR?
La mia ipotesi è che questo viene interpretato come una richiesta sito croce, dal momento che i js è ospitato in un porto diverso da quello SignalR hub. [La stessa politica sulle origini] (http://en.wikipedia.org/wiki/Same-origin_policy) è in vigore. – scheien
Questo è plausibile, ma perché Silverlight, anch'esso ospitato su una porta diversa, si collega con successo? E se è così, è possibile impostare l'hub SignalR in modo tale che siano consentite le richieste incrociate? – henk
[Uso di CORS] (http://www.html5rocks.com/en/tutorials/cors/). È il browser chi è l'autore del reato. Nell'implementazione Silverlight si sta utilizzando il client .NET SignalR che presumo? – scheien