2012-08-07 22 views
5

Aktualnie obsługuję zarówno moją aplikację railsową, jak i aplikację faye-server na Heroku. Serwer faye został sklonowany stąd (https://github.com/ntenisOT/Faye-Heroku-Cedar) i wydaje się działać poprawnie. Mam wyłączone strony internetowe, ponieważ nie są one obsługiwane na Heroku. Pomimo twierdzenia na stronie Faye, że:Faye na Heroku: Problemy z wieloma domenami

"Klienci i serwery Faye transparentnie obsługują komunikację między domenami, dzięki czemu klient może łączyć się z serwerem w dowolnej domenie bez dalszej konfiguracji."

jestem nadal działa w ten błąd, gdy próbuję odpowiedzieć na kanale faye:

XMLHttpRequest cannot load http://MYFAYESERVER.herokuapp.com. Origin http://MYAPPURL.herokuapp.com is not allowed by Access-Control-Allow-Origin. 

czytałem o CORS i próbował wdrożenie niektórych rozwiązań przedstawionych tutaj: http://www.tsheffler.com/blog/?p=428 ale dotąd nie miał szczęścia. Chciałbym usłyszeć od kogoś, kto:

1) posiada aplikację szyn hostowane na Heroku 2) posiada serwer Faye hostowane na Heroku 3) posiada dwie z nich skutecznie komunikować się ze sobą!

Dziękuję bardzo.

Odpowiedz

1

Właśnie mój Faye i szyn aplikacje hostowane na Heroku komunikuje się w ciągu ostatniej godziny lub tak ... oto moje obserwacje:

  1. Upewnij się, że twój FAYE_TOKEN jest ustawiony na wszystkich serwerach, jeśli używasz zmiennej env.

  2. Wyłącza websockets, które już zrobiłeś ... client.disable(...) nie działa dla mnie, użyłem zamiast tego Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }.

  3. To może ale nie musi odnosić się do ciebie, ale było dla mnie najtrudniejsze do wyśledzenia ... w moim środowisku deweloperskim, port, na którym działa moja aplikacja, zostanie umieszczony na końcu podanej nazwy hosta dla mój serwer faye ... ale wydawało się, że spowodował brak komunikacji w produkcji. Pracowałem nad tym, tworząc metodę broadcast_server_uri w application_controller.rb, która zajmuje się włączeniem portu, gdy jest to konieczne, a następnie używa go wszędzie tam, gdzie rozpoczynam nowy kanał.

....

class ApplicationController < ActionController::Base 
    def broadcast_server 
     if request.port.to_i != 80 
     "http://my-faye-server.herokuapp.com:80/faye" 
     else 
     "http://my-faye-server.herokuapp.com/faye" 
     end    
    end 
    helper_method :broadcast_server 

    def broadcast_message(channel, data) 
    message = { :ext => {:auth_token => FAYE_TOKEN}, :channel => channel, :data => data} 
    uri = URI.parse(broadcast_server) 
    Net::HTTP.post_form(uri, :message => message.to_json) 
    end 


end 

I w moim app javascript, włączając

<script> 
    var broadcast_server = "<%= broadcast_server %>" 
    var faye; 
$(function() { 
    faye = new Faye.Client(broadcast_server); 
    faye.setHeader('Access-Control-Allow-Origin', '*'); 
    faye.connect(); 
    Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) } 

     // spin off your subscriptions here 
    }); 
</script> 

FWIW, nie chciałbym podkreślić o ustawienie Access-Control-Allow-Origin za nim nie ma żadnego znaczenia - niezależnie od tego, widzę XMLHttpRequest cannot load http://..., ale powinno to nadal działać na tyle dobrze, aby odblokować użytkownika. (chociaż chciałbym się nauczyć czystszego rozwiązania ...)

+0

Cześć Soychicka, wielkie dzięki za to. Sprawdzam to teraz. Jedno pytanie, czy zmodyfikowaliście ApplicationController dla swojej aplikacji lub utworzyliście go dla serwera Faye? –

+0

Hmm ... nadal nie działa. Subskrypcja wydaje się być w porządku, ale kiedy ją opublikuję, nie zostanie odebrana. Komenda faye.publish ("/ channel", {data: "data"}) wysyła POST do serwera faye, ale wydaje się, że nie ma odpowiedzi. Jednym z pytań, które publikujesz, jest Twoje żądanie szyfrowane w następujący sposób: message =% 5B% 7B% 22channel% 22% 3A% 22% 2Ffoo% 22% 2C% 22dana% 22% 3A% 7B% 22text% 22% 3A% 22Hi% 20there% 22% 7D% 2C% 22clientId% 22% 3A% 22bqk8vbj7v6j10jqsoogrxr7cn% 22% 2C% 22id% 22% 3A% 221hj9hf41cgaa8m1x3nllu0zyzphv% 22% 7D% 5D –

+0

Jak skonfigurowałeś swój serwer faye na heroku? Czy korzystałeś z konkretnego repozytorium github? –

0

Nie mogę powiedzieć, że użyłem Rails/Faye na Heroku, ale czy próbowałeś ustawić nagłówek Access-Control-Allow-Origin na coś takiego jak Access-Control-Allow-Origin: your-domain.com?

Do testowania można również zrobić Access-Control-Allow-Origin: * aby zobaczyć czy to pomaga

niestandardowe nagłówki

Niektóre usługi wymagają użycia dodatkowych nagłówków HTTP, aby połączyć się z serwerem ich Bayeux. Możesz dodać te nagłówki za pomocą metody setHeader() i zostaną one wysłane, jeśli podstawowy transport obsługuje zdefiniowane przez użytkownika nagłówki (aktualnie tylko długie odpytywanie).

client.setHeader ("autoryzacja", "OAuth abcd-1234");

Źródło: http://faye.jcoglan.com/browser.html

Więc spróbuj client.setHeader('Access-Control-Allow-Origin', '*');

+0

Tak, ale mam małe problemy z ustaleniem, gdzie mam ustawić nagłówek Access-Control-Allow-Origin. Próbowałem to zrobić w aplikacji ApplicationController na mojej aplikacji szyny, ale to nie działało. –

+0

Powinieneś ustawić go na swoim serwerze faye, ponieważ tam, gdzie dane pochodzą z – arcyqwerty

+0

Tak jak: Rails - [ajax] -> Faye - [odpowiedź z Access-Control-Allow-Origin] -> Rails – arcyqwerty

Powiązane problemy