2013-01-16 8 views
6

Używam Sencha Touch 2.1.0. Tworzę wywołanie HTTP GET. Jest to prośba CORS. Dlatego też wysyła polecenie OPCJE HTTP przed lotem zgodnie z oczekiwaniami.OPCJE HTTP Żądanie przed lotem Obciążenie anulowane oczekujące Stan w Chrome

Zainstalowałem filtr CORS na moim serwerze i skonfigurowałem go. Połączenia z mojego kodu przebiegały bardzo dobrze do wczoraj. Nagle dziś przestało ładować dane. Kiedy sprawdzić połączenia sieciowe w Chrome, widzę, że metoda OPCJE pokazuje się jako „Load odwołany”

Metoda: opcje
tekst stanu: „Load anulowany”
Typ: czeka
Inicjator: Connection.js : 319

Miałem podobny problem, gdy po raz pierwszy skonfigurowałem filtr CORS. Kiedy wyczyściłem pamięć podręczną przeglądarki, zaczęło działać. Tym razem nie jestem pewien, dlaczego nagle przestał działać. Nie jest on naprawiany nawet po wyczyszczeniu pamięci podręcznej i historii w przeglądarce.

Jeśli wykonam dokładnie to samo połączenie z HTTPRequestor w Firefoksie, działa bardzo dobrze. Oto połączenie. Zamaskowałem URL ze względu na poufność.

OPTIONS http://myurl/rest/items?_dc=1358304888220&page=1&start=0&limit=25 HTTP/1.1 
Access-Control-Request-Method: GET 
Origin: http://localhost:8080 
Access-Control-Request-Headers: accept, origin, x-requested-with 

To samo dokładne żądanie daje mi bardzo dobrą odpowiedź od HTTPRequestor. Oto wynik:

OPTIONS http://myurl/rest/items?_dc=1358304888220&page=1&start=0&limit=25 
Access-Control-Request-Headers: accept, origin, x-requested-with 
Access-Control-Request-Method: GET 
Origin: http://localhost:8080 


-- response -- 
200 OK 
Date: Wed, 16 Jan 2013 03:19:27 GMT 

Server: Apache-Coyote/1.1 

Access-Control-Allow-Origin: http://localhost:8080 

Access-Control-Allow-Credentials: true 

Access-Control-Allow-Methods: HEAD, GET, POST, OPTIONS 

Access-Control-Allow-Headers: X-Requested-With, Origin, Accept, Content-Type 

Content-Length: 0 

Strict-Transport-Security: max-age=15768000, includeSubDomains 

Keep-Alive: timeout=15, max=100 

Connection: Keep-Alive 

kod Sencha w sklepie, aby dokonać tego połączenia:

proxy: { 
     type: 'ajax', 
     method: 'GET', 
     url: 'http://myurl/rest/items', 
     withCredentials: true, 
     useDefaultXhrHeader: false, 
     disableCaching: false, 
     headers: { 
      "Accept": "application/json" 
     }, 
     failure: function(response) { 
      if (response.timedout) { 
       Ext.Msg.alert('Timeout', "The server timed out :("); 
      } else if (response.aborted) { 
       Ext.Msg.alert('Aborted', "Looks like you aborted the request"); 
      } else { 
       Ext.Msg.alert('Bad', "Something went wrong with your request"); 
      } 
     }, 
     success: function(response){ 
      Ext.Msg.alert(response.responseText); 
     } 
    }, 
    autoLoad: true, 

Proszę mi pomóc zrozumieć, w jaki sposób mogę rozwiązać ten problem.

+0

Czy możesz wyświetlić kod JavaScript, którego używasz do złożenia zamówienia? Czy ustawiasz '.withCredentials = true;'? – monsur

+0

@Monsur, Właśnie dodałem kod sencha, który jest używany do wykonania tego połączenia. Tak z wartościąKredencje jest prawdziwe. Ten kod działał do wczoraj i przestał działać nagle. Nie jestem pewien, co poszło nie tak. Nie wprowadziłem żadnych zmian po stronie serwera. –

Odpowiedz

2

To wydaje się być problem związany z ostatnią aktualizacją Google Chrome. Kiedy próbuję z żelazną przeglądarką, to działa.

0

Miałem podobny problem w wersjach beta przeglądarek Webkit. Jak się okazuje, nagłówek Content-Type jest ustawiany niejawnie dla XMLHttpRequest zawierających Blobs, więc musiałem dodać to do Access-Control-Allow-Headers na moim serwerze przesyłania.

Patrz: https://bugs.webkit.org/show_bug.cgi?id=99983

0

właśnie rozwiązał ten problem. Odpowiedź serwera Nagłówek powinien być ustawiony jako:

"Access-Control-Allow-Origin": "*" 
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept" 

Zrobiłeś to już. Myślę, że jeśli metoda GET lub POST zawiera nagłówek X-Requested-With, metoda OPTIONS zostanie wysłana jako pierwsza. Nagłówek X-Requested-With znajduje się w domyślnym nagłówku XHR. Dlatego powinniśmy ustawić "useDefaultXhrHeader" na false. Ext.data.Store nie obsługuje tego parametru. Edytuj sdk/src/data/Connection.js, zmień domyślną wartość useDefaultXhrHeader na false.

Powiązane problemy