2012-01-22 10 views
6

Ciao Sto cercando di inviare un semplice messaggio HTTP dal server Flex a C#, ma sembra che sto ricevendo chiamate di rimorchio, prima è quella vera e la seconda è vuota.Gestire http licenziato da Flex nel server C#

Perché è e come posso gestirlo?

Questo è il mio codice C#:

TcpListener listener = new TcpListener(IPAddress.Any, 9400); 
listener.Start(); 
Console.WriteLine("Server started"); 
Socket client; 
while (true) 
{ 
    client = listener.AcceptSocket(); 
    // client.Available is an expensive call so it's just for testing 
    Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 
    SocketHandler handler = new SocketHandler(); 
    ThreadPool.QueueUserWorkItem(handler.handleSocket, client); 
} 

questo è il SocketHandler:

public void handleSocket(object socketObjeck) 
{ 
    try 
    { 
     socket = (Socket)socketObjeck; 
     byte[] buffer = new byte[1024]; 
     SocketSettings.setSocket(socket); 
     //blocker... 
     try 
     { 
      socket.Receive(buffer); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error\nFaild reading from socket\n" + e.Message); 
      socket.Close(); 
      return; 
     } 
     parseData(buffer); 

     socket.Close(3); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Error\nError \n" + e.Message + "\n" + e.StackTrace); 
    } 
} 

E questo è il mio codice flex:

var request:URLRequest = new URLRequest(); 
request.data = "Hello from flex"; 
request.url = URL; 
request.method = URLRequestMethod.POST; 
loader.load(request); 

sto ottenendo sempre 2 chiamate. La riga:

Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 

chiamato due volte. Cosa mi manca?

Edit 1: vi posso dire per certo che la seconda chiamata è vuoto, non è nemmeno visto in cromo JavaScript console, è come flex apertura di una connessione, e in attesa di qualche risposta o non so cosa ... ma non invia dati.

Edit 2:

ho cercato di inviare un vera risposta HTTP un avviso di un'altra cosa, la seconda chiamata è in arrivo senza attendere la prima chiamata, se sto mettendo il filo risposta a breve sonno (100 millisecondi nel mio test) quindi ricevo la seconda chiamata prima di essere in grado di rispondere per il primo.

P.S Utilizzando Flex 4.6, Visual Studio 2010

+0

Perché non dare un'occhiata al client fine a ciò che viene effettivamente richiesto? Firebug, Fiddler o Charles saranno in grado di farlo. – spender

risposta

0

Dopo tutto si gira che è stata la richiesta di dominio. Se non aggiungi un file crossdomain nella tua cartella www, flex ti invierà un messaggio vuoto (se proverai a rispondere a questo messaggio con il crossdomain, vorrai lavorare).

3

Come accennato @Spender, e' difficile sapere quale sia la ragione per le chiamate è, senza sapere che cosa le chiamate sono.

Tuttavia, dato che si sta utilizzando un URLRequest per comunicare, è possibile che la prima chiamata sia una richiesta per il file crossdomain.xml, che deve essere presente affinché il flash player possa comunicare con il proprio server.

Altri protocolli hanno chiamate di inizializzazione diversi (ad es., RemoteObject o NetConnection invierà una chiamata intial per impostare la FlexClientId locale e un SocketServer chiameranno per un crossdomain.xml su una porta specifica.)

La morale della storia: è necessario verificare qual è il contenuto della richiesta prima di poter rispondere.

+0

+1 Questo è più o meno dove ho pensato che ulteriori indagini potrebbero portare (es. Richieste a crossdomain.xml) – spender

1

vedo due punti:

  • crossdomain.xml deve essere presente server-side per far funzionare tutto dal lato client

  • uso HttpListener sul lato server invece TcpListener, che renderà il vostro codice molto più robusto poiché ha tutti i dettagli del protocollo http implementati e consente di concentrarsi solo sul "lavoro reale"

Si prega di chiedere se avete bisogno di ulteriori dettagli/campioni, ecc.

+0

Infatti HttpListener risolve il problema, ma non è possibile eseguirne il debug perché richiede l'autorizzazione di amministratore per eseguire il server, e c'è un po ' un'analisi extra dall'implementazione di Microsoft che è un periodo di tempo inutile e non necessario per me. E il più importante, non posso sapere se questo risolve il problema, forse hanno solo un tentativo di catturare messaggi vuoti, quindi non lo vedrei nemmeno ... A proposito di crossDomain, se fosse l'esiu, il mio cliente non lo avrebbe essere in grado di lavorare a tutti, ma è, sta solo mandando messaggi inutili ... –

+0

@Babibu 'HttpListener' può essere avviato senza privilegi di amministratore (specialmente quando lo si esegue sulla porta> 1023 come nel caso 9400) . Puoi usare 'netsh' con admin privilegi per registrare l'URI di base e dopo questo l'applicazione/HttpListener può essere eseguita senza privilegi di amministratore ... – Yahia

+0

@Babibu' HttpListener' utilizza gli stessi componenti del sistema operativo di IIS (un modulo kernel chiamato HTTP.SYS) ... non "inghiotte" i messaggi vuoti – Yahia