2009-02-13 15 views
38

Ho sviluppato un servizio WCF che utilizza l'adattatore net.tcp e ascolta una porta specifica. Voglio collegarmi a quel servizio usando un normale client .net che usa i socket per inviare i dati alla porta e ascolta le risposte.
Quando si tenta di inviare dati a questo servizio, viene visualizzato l'errore: "La connessione esistente è stata forzatamente chiusa dall'host remoto".
Tuttavia, sono in grado di connettersi con il servizio da un altro client che utilizza l'indirizzo/binding/contratti del servizio WCF.
C'è un modo che mi consente di comunicare con un servizio WCF utilizzando un normale client basato su socket?Come utilizzare il client basato su socket con il servizio WCF (net.tcp)?

+0

Per essere sicuri che tutti capiscono cosa stai cercando di fare qui ... vorresti chiarire se stai cercando di utilizzare la funzione di programmazione di socket incorporata in .NET per connettersi a un servizio WCF Net.Tcp e viceversa? –

+0

EnocNRoll, hai assolutamente ragione. Sto cercando di utilizzare un client basato su socket per comunicare un servizio WCF basato su net.tcp. – Burhan

risposta

48

La decisione chiave è se fare o meno il servizio WCF conforme al cliente presa o se rendere il client presa conforme al servizio WCF.

Sarà più semplice per tentare di conformarsi al servizio WCF, piuttosto che cercare di implementare qualcosa di personalizzato all'interno di WCF, che non è mai facile. Nella parte inferiore della sezione Altre risorse di seguito verrà visualizzato un collegamento che descrive l'ispezione dei messaggi che è necessaria per tentare di conformarsi a un servizio WCF.

Detto questo, prese NET non nativo comunicano con WCF.

Qualsiasi tentativo di farlo richiede una programmazione personalizzata sul lato WCF delle cose.

Sia che si utilizzi TcpClient o socket di tipo raw in .NET per connettersi e comunicare con WCF non importa. Qualsiasi interoperabilità di questo tipo deve essere gestita con logica personalizzata all'interno di WCF. Si noti che Net.Tcp è un protocollo di trasporto personalizzato. Non sta tecnicamente usando TCP nello stesso modo in cui è TcpClient.

Per esempio, UDP è molto comunemente usato da server socket nel mondo Linux. WCF non fornisce un trasporto UDP integrato. Tuttavia, esiste un esempio UDP per WCF che implementa UDP per WCF. Sfortunatamente, questo esempio non illustra la comunicazione da e verso un server socket UPD non WCF.

Ho una domanda eccezionale che è piuttosto dettagliata in cui spiego il mio sforzo per ottenere il codice di esempio genericamente essere verificabile per l'utilizzo di UDP ...

Is it possible to make the WcfTestClient work for custom transport channels?

Nessuno ha ancora risposto alla mia domanda. Quindi, se riesci a fare questo lavoro, sono molto interessato. Il mio caso è stato motivato dal desiderio che il servizio WCF fosse in grado di chiamare un server socket UDP in esecuzione su Linux senza dover confondere il mio servizio con la codifica non-WCF. Non voglio mescolare approcci.

Altre risorse ...

+10

La mia risposta sicuramente non merita di essere downvoted. –

+2

ma hai criticato la meravigliosa WCF, quindi devi essere portato fuori e sparato :) - Avere +1 anche da me. – gbjbaanb

+1

Grazie, cerco di rendere la mia risposta utile e li aggiorno sempre se non sono corretti in alcun modo. Li vedo come riferimenti per la mia conoscenza personale, non solo per i punti su StackOverflow. –

0

Hy,

hai abilitare la WCF Tracing? Perché se lo fai e ricevi il seguente messaggio: "Il servizio non ti consente di accedere in modo anonimo." quindi è (di solito) un problema di impostazione di sicurezza.

In questo caso disattivare la modalità di protezione per il vostro legame:

<netTcpBinding> 
    <binding name="MyCustomBinding"> 
     <security mode="None" /> 
    </binding> 
</netTcpBinding> 

Ma meglio sarebbe quello di lavorare con i certificati.

6

vincolante La Net.Tcp utilizza un formato di frame-level filo personalizzato che non è realmente documentato, anche se Nicholas Allen ha iniziato una serie di post di blog sul tema di recente. La serie inizia qui: http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx

Per essere onesti, Net.TCP è davvero, attualmente, più utile per la comunicazione WCF in WCF. se si desidera utilizzare un formato TCP personalizzato che è necessario gestire, è molto meglio utilizzare socket raw o creare il proprio canale di trasporto WCF personalizzato (che potrebbe non essere banale, btw)

+1

È ben documentato, vedere [MC-NMF] Specifiche per i protocolli di frame dei messaggi .NET. – Soonts