Tidhttpserver solleva l'errore ethead 6 quando lo attivi nel mio test Dunit
-
13-11-2019 - |
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é.
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;