Domanda

Ho bisogno di un server HTTP locale per il mio test unitario.

Quando provo ad attivare tidhttpserver a SetUp, fallisce con il messaggio Ethread:

"Errore del thread: descrittore non valido (6)"

Ecco come lo inizialisco:

type
  TestMyUnit = class(TTestCase)
...
procedure TestMyUnit.SetUp;
begin
  FServer := TIdHTTPServer.Create(nil);
  FServer.OnCommandGet := HTTPServerCommandGet;
  FServer.Active := True;   // <---- This will cause error
end;

Forse ci sono alcune restrizioni usando il tidhttpserver di Indy con Dunit Framework?

  • Delphi 2010
  • Indy 10

L'eccezione è stata lanciata da qualche parte dopo questa linea TIdListenerThread.Run Proc (IdCustomtCpserver Unit)

LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn);

Tuttavia, non posso rintracciarlo più in profondità, non so perché.

È stato utile?

Soluzione 2

Risolto. Ho il mio DPK con componenti auto-progettati (utilizzati da questo test unitario) e c'era 1 unità con riferimenti a Indy. Dopo aver ricostruito quel pacchetto, il compilatore mi ha proposto di aggiungere un nuovo dccreferenza ai componenti Indy. Dopo aver reinstallato il mio pacchetto, quell'errore nel test unitario è andato.

Non riesco a immaginare le relazioni causa-effetto, ma ora va bene.

Altri suggerimenti

Potrebbe essere necessario consentire l'eseguibile DUNIT di aprire la porta nella configurazione del firewall ... Pannello di controllo> Firewall Windows> Impostazioni avanzate> Regole in entrata.

Di solito Windows ti chiederà la prima volta che l'eseguibile cerca di aprire la porta, ma controllerei che c'è comunque una regola.

Modificare:

Basta aggiungere un po 'più di informazioni, l'errore "descrittore non valido" sembra un errore di Winsock e potrebbe essere perché il tuo codice non può aprire la porta. Potrebbe essere perché è bloccato al firewall (come intendo sopra) o potrebbe essere che tu abbia un altro programma che ha quella porta aperta ... come forse IIS? Sceglierei una porta sopra 1024 da qualche parte e impostare il tuo server Web per usarlo (e ovviamente il tuo client).

EDIT 2:

Il mio codice per l'impostazione del mio tidhttpserver è:

FServer := TIdHttpServer.Create(nil);
FServer.DefaultPort := 7777;
FServer.AutoStartSession := True;
FServer.OnCommandGet := ServerCommandGet;
FServer.OnCreatePostStream := ServerCreatePostStream;

FServer.Active := True;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top