2013-03-17 10 views
7

Próbuję zaimplementować połączenia międzydomenowe za pomocą SignalR 1.0.1 z Chrome (wersja 25.0.1364.172). Ponieważ mam mój interfejs użytkownika na jednym hoście (localhost: 16881) i "usługa" na innym hoście (localhost: 16901).SignalR 1.0.1 Żądanie między domenami (CORS) z Chrome

mam wszystko na swoim miejscu, jak w temacie How to use cross-domain connections (CORS - Access Control Allow Origin) with SignalR

add jQuery.support.cors = true; before opening a connection 
set up $.connection.hub.url = 'http://localhost:16901/signalr';, pointing to your subdomain 

allow cross-domain requests on server side, by adding the following header description: 

<add name="Access-Control-Allow-Origin" value="http://localhost:16881" /> 

inside system.WebServer/httpProtocol/customHeaders section in Web.config file. 

Mam też HubConfiguration ustanowiony dla mojego wyznaczaniu trasy w global.asax dla SignalR 1.0.1

  RouteTable.Routes.MapHubs(new HubConfiguration() 
      { 
       EnableCrossDomain = true 
      }); 

wyglądem Everything dobrze w IE10 i FF22. Jednak w Chrome daje mi to przykrość, gdy SignalR próbuje wykonać handshake.

XMLHttpRequest cannot load http://localhost:16901/signalr/negotiate?_=1363560032589. Origin http://localhost:16881 is not allowed by Access-Control-Allow-Origin. 

Wiem, że mogę go uruchomić w Chrome, uruchamiając go z opcją --disable-web-security, ale to naprawdę nie spełnia moich wymagań. Proszę pomóż!

Odpowiedz

11

Oto co trzeba zrobić:

  1. Usuń jQuery.support.cors = true
  2. Usuń <add name="Access-Control-Allow-Origin" value="http://localhost:16881" />

Wtedy powinno działać dobrze.

+0

Awesome! To działa! Czy wiesz, dlaczego jQuery.support.cors = true i Access-Control-Allow-Origin spowodowałoby problem w Chrome? – Adamy

+0

Domyślam się, że ustawiłeś niewłaściwą rzecz dla Access-Control-Allow-Origin, i że jQuery.support.cors = true. – davidfowl

+1

Ustawienie jQuery.support.cors na true powoduje wyłączenie JSONP, ponieważ powoduje, że SignalR przyjmuje, że przeglądarka obsługuje CORS. – halter73

0

Nie trzeba używać

jQuery.support.cors = true;

Zamiast tego można włączyć obsługę CORS w swojej klasie uruchamiania w metodzie konfiguracji. Oto kilka przykładów:

 // Branch the pipeline here for requests that start with "/signalr" 
     app.Map("/signalr", map => 
     { 
      // Setup the CORS middleware to run before SignalR. 
      // By default this will allow all origins. You can 
      // configure the set of origins and/or http verbs by 
      // providing a cors options with a different policy. 
      map.UseCors(CorsOptions.AllowAll); 
      var hubConfiguration = new HubConfiguration 
      { 
       // You can enable JSONP by uncommenting line below. 
       // JSONP requests are insecure but some older browsers (and some 
       // versions of IE) require JSONP to work cross domain 
       // EnableJSONP = true 
      }; 
      // Run the SignalR pipeline. We're not using MapSignalR 
      // since this branch already runs under the "/signalr" 
      // path. 
      map.RunSignalR(hubConfiguration); 
     });