2014-11-14 11 views
9

Il mio problema:Chiamata di più webservices con diversi tipi di certificati in un ambiente multithreading

ho una webapp (NET 4.5.1) fare più chiamate a webservices esterni. Alcuni servizi comunicano solo tramite SSL e altri solo su TSL.

So che, per qualche motivo, ServicePointManager.SecurityProtocol può essere impostato staticamente in modo globale per l'appdomin (perché non ne ho idea globale), ma dal momento che più chiamate possono occorrere contemporaneamente a diversi servizi esterni in thread diversi - Non posso semplicemente cambiare il SecurityProtcol per l'appdomain per ogni chiamata di servizio.

Domanda:

Come devo gestire questo in un ambiente web app multithread? Devo far apparire le chiamate di servizio in diverse appdomain dove posso impostare SecurityProtocol? E se è così - come dovrei farlo?

+0

Un canale personalizzato può essere creato e consumato all'interno dell'ambiente multi-thread adatto alla tua situazione d'uso. – Saravanan

+0

Se risolverà il problema di threading che ho descritto su okarpov qui sotto, allora sì, certo. –

risposta

0

Da Microsoft:

public static SecurityProtocolType SecurityProtocol {get; impostato; }

La struttura, seleziona la versione del Secure Sockets Layer (SSL) o Transport Layer Security (TLS) protocollo da utilizzare per le nuove connessioni che utilizzano il protocollo Secure Hypertext Transfer (HTTPS)> schema solo; le connessioni esistenti non sono cambiate.

prega, prestare attenzione su: "da utilizzare per le nuove connessioni ... le connessioni esistenti non vengono modificati"

così, aggiornare questa proprietà appena prima di aprire una nuova connessione

+0

Bene, come ho scritto nella mia domanda, so di usare la proprietà statica, tuttavia non funziona in un ambiente multithreading poiché più thread possono regolare quella statica durante la creazione di una chiamata di servizio. Fondamentalmente deve essere una soluzione a prova di sicurezza. Le "connessioni esistenti non sono cambiate". si applica solo alle chiamate di servizio già create. –

+0

sì, è necessario bloccare il tuo caso per essere in grado di impostare la proprietà e creare una chiamata e quindi rilasciare il blocco – okarpov

+0

Bene, questo avrebbe bisogno che io usassi lo stesso lock su ogni chiamata di servizio che effettivamente bloccherebbe l'applicazione web per tutti gli utenti che ha bisogno di ottenere dati di servizio durante una singola chiamata di servizio utente. È una soluzione, solo non molto utile. –

0

Come molti servizi esterni usa la tua app? Non puoi creare ServicePoint in anticipo (all'avvio dell'app) e riutilizzarli quando necessario?

1

Ho avuto questo problema e ho trovato questa soluzione che funzionava per me.

mi basta usare ServicePointManager per gestire i certificati di connessione

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

private bool ValidateRemoteCertificate(object Sender, X509Certificate Certificate, X509Chain Chain, SslPolicyErrors PolicyErrors) 
     { 
      ... 
     } 

da maneggiare con diverse richieste che ho avuto un dizionario URL del server di mappatura ad un compito. Ogni attività viene eseguita in modo asincrono, il che significa che non devo gestire direttamente i thread e all'interno di ognuno di essi ho finalmente utilizzato gli oggetti System.Net. Vale a dire, HttpWebRequest, FtpWebRequest e SmtpWebRequest. Ognuno di essi ha una proprietà per abilitare/disabilitare la connessione SSL ma tutti hanno lavorato con lo stesso metodo per convalidare i certificati.

Problemi correlati