2014-07-10 13 views
6

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?

+1

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

+0

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

+0

[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

risposta

13

Change

$(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); 
     }); 
}); 

a

$(function() 
{ 
var connection = $.hubConnection("http://localhost:1968"); 
var hub = connection.createHubProxy("echo"); 
hub.on("AddMessage", Method); 
connection.start({ jsonp: true }) 
      .done(function() { 
      console.log('connected'); 
      hub.say("success?"); 
     }) 
     .fail(function (a) { 
      console.log('not connected'+a); 
     }); 
}); 

function Method(messageFromHub) 
{ 
alert(messageFromHub); 
} 

e

class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 
    } 
} 

a

class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(new HubConfiguration() { EnableJSONP = true });} 
} 

Dovrebbe fare.

app.MapSignalR(new HubConfiguration() { EnableJSONP = true });} 

e

connection.start({ jsonp: true }) 

permetterà richiesta sito croce

+0

Grazie. La connessione sta funzionando da entrambi i lati! – henk

+0

Grazie, mi ha aiutato con web Api e client PHP –

1

RPC sul server in SignalR con createHubProxy():

Grazie alla risposta da Vishal Ravlani

Ma per me

hub.say("success?"); 

non funziona! (? Funziona per voi)

devo scrivere:

hub.invoke('say','success?'); 

E SignalR ha automaticamente rilevato CrossOrigin sul client.

Sul server ho usato:

app.Map("/signalr", map => 
      { 
       map.UseCors(CorsOptions.AllowAll); 

       map.RunSignalR(); 
      }); 

che è stato descritto in: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client#crossdomain

+0

Questa non è una risposta per quanto posso vedere? Se hai una domanda, dovresti creare la tua ... –

+0

Questa è stata un'aggiunta alla risposta di Vishal Ravlanis. Nel mio caso questa risposta non funziona completamente. La mia domanda è rivolta a Vishal Ravlanis ... – MichiBack

+0

1 @MichiBack 'hub.Invoke' ha funzionato anche per me piuttosto che' hub.say' –

Problemi correlati