2014-11-14 10 views
9

Mój problem:Wywoływanie webservices z wielu różnych typów certyfikatów w środowisku wielowątkowym

Mam webapp (.NET 4.5.1) robi wiele połączeń do zewnętrznych serwisów internetowych. Niektóre usługi komunikują się tylko za pośrednictwem protokołu SSL i innego niż tylko TSL.

Wiem, że z jakiegoś powodu ServicePointManager.SecurityProtocol można ustawić statycznie globalnie dla appdomin (Dlaczego jego globalny nie mam pojęcia), ale ponieważ wiele połączeń może pojawić się w tym samym czasie do różnych usług zewnętrznych w różnych wątkach - Nie mogę po prostu zmienić SecurityProtcol dla appdomain dla każdego wywołania serwisowego.

Pytanie:

Jak mam sobie z tym poradzić w wielowątkowym środowisku Web App? Czy powinienem wykonywać rozmowy serwisowe w różnych domenach, w których mogę ustawić SecurityProtocol? A jeśli tak - jak mam to zrobić?

+0

Czy kanał niestandardowy zostanie utworzony i użyty w środowisku wielowątkowym, pasuje do Twojego przypadku użycia. – Saravanan

+0

Jeśli to rozwiąże problem z gwintowaniem, który opisałem na okarpov poniżej - to oczywiście tak. –

Odpowiedz

0

Od Microsoft:

public static SecurityProtocolType SecurityProtocol {get; zestaw; }

Ta właściwość służy do wybierania wersji protokołu SSL (Secure Sockets Layer) lub Transport Layer Security (TLS), który ma być używany w przypadku nowych połączeń korzystających tylko ze schematu bezpiecznego protokołu HTTPS (Hypertext Transfer Protocol); istniejące połączenia nie są zmieniane.

Proszę zwrócić uwagę na temat: „do wykorzystania dla nowych połączeń ... istniejące połączenia nie są zmieniane”

tak, zaktualizuj tę właściwość tuż przed otwarciem nowego połączenia

+0

Cóż, jak napisałem w moim pytaniu, wiem o używaniu właściwości statycznej, jednak nie działa ona w środowisku wielowątkowym, ponieważ wiele wątków może regulować te statyczne podczas tworzenia zgłoszenia serwisowego. Zasadniczo musi to być rozwiązanie z wątkami. "Istniejące połączenia nie są zmieniane." dotyczy tylko zgłoszeń serwisowych już utworzonych. –

+0

Tak, potrzebujesz blokady w twoim przypadku, aby móc ustawić właściwość i utworzyć połączenie, a następnie zwolnić blokadę – okarpov

+0

No cóż, potrzebowałabym użyć tej samej blokady dla każdego połączenia serwisowego, które skutecznie zablokowałoby aplikację dla wszystkich użytkowników który musi uzyskać dane usługi podczas pojedynczego wywołania usługi użytkownika. To rozwiązanie, po prostu niezbyt użyteczne. –

0

Jak wiele usług zewnętrznych używa Twojej aplikacji? Czy nie możesz wcześniej utworzyć ServicePoints (na początku aplikacji) i po prostu użyć ich ponownie w razie potrzeby?

1

Miałem ten problem i znalazłem to rozwiązanie, które sprawdziło się u mnie.

wystarczy użyć ServicePointManager obsługiwać certyfikaty połączenia

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

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

obsługiwać z różnymi wnioskami miałem słownika adresów URL serwera mapowania do zadania. Każde zadanie działa asynchronicznie, co oznacza, że ​​nie muszę obsługiwać wątków bezpośrednio, a wewnątrz każdego z nich w końcu korzystałem z obiektów System.Net. Mianowicie, HttpWebRequest, FtpWebRequest i SmtpWebRequest. Każda z nich ma właściwość włączania/wyłączania połączenia SSL, ale wszystkie pracowały z tą samą metodą sprawdzania poprawności certyfikatów.

Powiązane problemy