2012-03-14 2 views
51

Sto utilizzando il modello WCF4.0 - REST. Sto cercando di creare un metodo per caricare un file utilizzando uno stream.Impossibile stabilire una connessione perché il computer di destinazione lo ha rifiutato attivamente 127.0.0.1:3446

Il problema si verifica sempre a

Stream serverStream = request.GetRequestStream(); 

Classe per lo streaming:

namespace LogicClass 
{ 
    public class StreamClass : IStreamClass 
    { 
     public bool UploadFile(string filename, Stream fileStream) 
     { 
      try 
      { 
       FileStream fileToupload = new FileStream(filename, FileMode.Create); 
       byte[] bytearray = new byte[10000]; 
       int bytesRead, totalBytesRead = 0; 
       do 
       { 
        bytesRead = fileStream.Read(bytearray, 0, bytearray.Length); 
        totalBytesRead += bytesRead; 
       } while (bytesRead > 0); 

       fileToupload.Write(bytearray, 0, bytearray.Length); 
       fileToupload.Close(); 
       fileToupload.Dispose(); 
      } 
      catch (Exception ex) { throw new Exception(ex.Message); } 
      return true; 
     } 
    } 
} 

progetto REST: progetto

[WebInvoke(UriTemplate = "AddStream/{filename}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
public bool AddStream(string filename, System.IO.Stream fileStream) 
{ 
    LogicClass.FileComponent rest = new LogicClass.FileComponent(); 
    return rest.AddStream(filename, fileStream); 
} 

Windows Form: per testare

private void button24_Click(object sender, EventArgs e) 
{ 
    byte[] fileStream; 
    using (FileStream fs = new FileStream("E:\\stream.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     fileStream = new byte[fs.Length]; 
     fs.Read(fileStream, 0, (int)fs.Length); 
     fs.Close(); 
     fs.Dispose(); 
    } 

    string baseAddress = "http://localhost:3446/File/AddStream/stream.txt"; 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress); 
    request.Method = "POST"; 
    request.ContentType = "text/plain"; 
    Stream serverStream = request.GetRequestStream(); 
    serverStream.Write(fileStream, 0, fileStream.Length); 
    serverStream.Close(); 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     int statusCode = (int)response.StatusCode; 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 
    } 
} 

Ho disattivato il firewall e la mia connessione Internet, ma l'errore esiste ancora. C'è un modo migliore per testare il metodo di caricamento?

traccia

Stack:

a System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) a System.Net.ServicePoint.ConnectSocketInternal (booleano connectFailure, Socket s4, s6 Socket, Socket & socket, IndirizzoIP & indirizzo, ConnectSocketState stato, IAsyncResult asyncResult, Int32 timeout, Exception & eccezione)

+1

Non dovrebbe essere necessario preoccuparsi di firewall o connessione ad internet per le connessioni locali. Nel tuo codice ti stai collegando alla porta '8000' ma nel tuo messaggio di errore la porta è' 3446'. È rilevante? –

+0

@Graphain che era un errore di battitura. Grazie per averlo menzionato. Si prega di consultare la mia modifica. – fiberOptics

risposta

105

"Attivamente rifiutato" significa che l'host ha inviato un reset anziché un ack quando si è tentato di connettersi. Non è quindi un problema nel tuo codice. O c'è un firewall che blocca la connessione o il processo che sta ospitando il servizio non è in ascolto su quella porta. Ciò potrebbe essere dovuto al fatto che non funziona affatto o perché è in ascolto su una porta diversa.

Una volta avviato il processo di hosting del servizio, provare netstat -anb (richiede i privilegi di amministratore) per verificare che sia in esecuzione e in ascolto sulla porta prevista.

Aggiornamento

: Su Linux potrebbe essere necessario fare netstat -anp.

+4

grazie per 'netstat -anb', non trovo la porta nella lista. Conoscete alcuni possibili passi per risolvere questo? Ho disattivato il firewall, disabilitato l'anti virus e disabilitato la connessione internet, ma esiste ancora un errore. – fiberOptics

+1

Come stai ospitando il servizio? Se stai sfogliando f5 da Visual Studio, è IIRC ospitato in iisexpress.exe. Puoi guardare lo stesso elenco per il processo di hosting per capire quale porta sta ascoltando. – Yaur

+2

"Come stai ospitando il servizio?" Questo mi ha davvero impedito di pensare per un po '. Cerco di eseguire il mio resto progetto che ospita il servizio a 3445 e di eseguire anche il progetto di Windows Form e di indirizzare l'host a 3445 anche. Quindi tutto va bene. Grazie! e grazie a tutti Mi hai aiutato molto. – fiberOptics

1

Verificare se qualsiasi altro programma sta utilizzando quella porta.

Se un'istanza dello stesso programma è ancora attiva, interrompere tale processo.

+0

L'ho fatto, in realtà ho un progetto di console di esempio che verifica se la porta è disponibile o meno. – fiberOptics

+0

Quando ho avuto questo problema, in realtà ho dovuto riavviare il mio pc per liberare la porta. –

+1

Hai provato a cambiare solo il numero porta? Ho avuto un problema simile all'hosting di CruiseControl, ho cambiato il numero di porta nella config, che non ho trovato con la scansione di netstat. –

1

Se si utilizza WCF storm, è possibile accedere anche all'endpoint del servizio WCF? In caso contrario, e lo stai ospitando in un servizio di Windows, probabilmente hai dimenticato di registrare quello spazio dei nomi. Non è molto pubblicizzato che questo passaggio è richiesto, ed è davvero fastidioso da fare.

Io uso this tool to do this; automatizza tutti quei passaggi macchinosi.

1

Ho ricevuto un messaggio di errore simile a Codice di errore TCP 10061: Impossibile stabilire una connessione perché il computer di destinazione lo ha rifiutato attivamente nel mio progetto corrente,. Trovo che questo codice di errore 10061 non è in grado di distinguere il caso in cui l'endpoint del servizio non viene avviato e il caso in cui sia bloccato dal firewall. Spesso, il firewall può essere spento, ma il problema è ancora lì.

È possibile testare il codice nei due modi seguenti.

  1. Inserire il codice per ottenere il tempo A che il servizio è avviato e l'ora B che il client invia la richiesta al server. Se B è precedente a A, può causare questo problema.
  2. Modificare la porta del server in un'altra porta disponibile anche nel sistema. Troverete lo stesso codice di errore riportato.

Sopra è la mia correzione. Funziona sulla mia macchina. Spero possa essere d'aiuto!

1

Ho avuto un problema simile. Nel mio caso il servizio funzionerebbe benissimo sulla macchina dello sviluppatore ma fallirebbe quando su una macchina QA. Si è scoperto che la macchina QA l'applicazione non era stato eseguito come amministratore e non ha avuto il permesso di registrare l'endpoint:

HTTP non poteva registrare URL http://+:12345/Foo.svc/]. Il tuo processo non ha diritti di accesso a questo spazio dei nomi (vedi http://go.microsoft.com/fwlink/?LinkId=70353 per i dettagli).

fare riferimento qui per sapere come farlo funzionare senza essere un utente amministratore: https://stackoverflow.com/a/885765/38258

6

Non è necessario riavviare il PC. Riavvia IIS.

Esegui -> 'cmd' (come admin) e digitare "iisreset"

+1

Vedo la porta quando eseguo 'netstat -anb' e ho anche riavviato il server. Ancora lo stesso errore, qualche aiuto? –

+0

Ah fantastico! riavviare 'iis' ha risolto questo problema per me. nessuna delle altre soluzioni ha funzionato Questo è sottovalutato! – Jawad

0

Controllare che il numero di porta nel file web.config della pagina web è lo stesso di quello che è ospitato su IIS.

0

Con questo errore sono stato in grado di rintracciarlo, grazie a @Yaur, è necessario controllare il servizio (WCF) se è in esecuzione e controllare anche le proprietà TCP in entrata e in entrata sulle impostazioni del firewall avanzato.

0

Ho avuto lo stesso problema sul mio server web "Impossibile stabilire una connessione perché il computer di destinazione lo ha attivamente rifiutato 161.x.x.235: 5672". Ho chiesto all'amministratore di aprire la porta 5672 sul server web, quindi ha funzionato correttamente.

+1

Nel server, aprire Windows Firewall con sicurezza avanzata. Aggiungi una nuova regola TCP in entrata/in uscita, inserisci la porta 5672. Faresti meglio a chiedere all'amministratore di rete di farlo per te. –

1

Ho avuto un problema simile rifiutando localhost e 127.0.0.1. cmd (admin) netstat -anb trovato la porta in esecuzione su 169.254.80.80 (non so che erano ip è venuto dal perché il mio IP della rete era 10.0.0.5 dopo aver messo in questo IP ha funzionato questo dà corretto IP:..

IPAddress ipAddress = ipHostInfo.AddressList[0]; 
Console.WriteLine(ipAddress.ToString()); 
.
0

con il modello simile, il mio cliente resto sta chiamando l'API del servizio, il servizio chiamato con successo durante il debug, ma non funziona sul codice pubblicato errore era: Impossibile connettersi al server remoto

Eccezione interna:. sistema .Net.Sockets.SocketException (0x80004005): impossibile stabilire una connessione perché il computer di destinazione ha rifiutato attivamente il servizio IP: 443 al Sys tem.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) su System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket & socket, Indirizzo IP & Indirizzo, Stato ConnectSocketState, IAsyncResult asyncResult, Eccezione & eccezione)

Risoluzione: impostare il proxy in Web config.

<system.net> 
    <defaultProxy useDefaultCredentials="true"> 
     <proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/> 
    </defaultProxy> 
</system.net> 
0

È necessario impostare il proxy del sistema Devi passare attraverso questo percorso controlpanel >> Opzioni Internet >> connnection >> Impostazioni LAN >> delega no tik: Usa server proxy

0

Ho anche avuto problemi con il servizio di comunicazione remota in C#.

ho preso risolto in 3 fasi:

  1. Cambia porta del protocollo di tutti i file dovunque viene utilizzato.
  2. Eseguire il programma server host e renderlo attivo.
  3. Ora esegui il tuo programma client.