2015-01-14 15 views
8

Tôi có API Web phải giao tiếp với một vài dịch vụ khác nhau. Hiện nay, tôi có API Web thiết lập để sử dụng giao thức bảo mật sau:Thay đổi giao thức bảo mật theo yêu cầu (HttpClient)

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Khi API gọi ra một dịch vụ khác qua HttpClient (nói như Twitter), nó sẽ sử dụng giao thức đó. Tuy nhiên, cùng một yêu cầu khác có thể đến để truy cập một thứ gì đó từ đám mây, vì bất kỳ lý do gì, hiện yêu cầu TLS (không phải TLS 1.2). Yêu cầu các đám mây, trước khi bắn ra, bộ giao thức bảo mật một lần nữa:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Vấn đề tôi đang chạy vào là khi hai yêu cầu riêng biệt và độc đáo đi vào, một cho Twitter và một cho điện toán đám mây , giao thức bảo mật có thể chuyển sang "sai" trước khi gửi đi, khiến yêu cầu không thành công.

Có cách nào để đặt giao thức bảo mật trên HttpClient theo yêu cầu để tôi không trao đổi xung quanh một cài đặt ở một số singleton ở đâu đó không?

+1

Đối với bất kỳ ai gặp vấn đề này và vẫn bị kẹt, tôi quyết định sử dụng AppDomain để cô lập các yêu cầu tới máy chủ lẻ, cho phép chuyển đổi giao thức bảo mật theo yêu cầu. http://www.superstarcoders.com/blogs/posts/executing-code-in-a-separate-application-domain-using-c-sharp.aspx – Porschiey

Trả lời

3

Dường như không có cách nào để thực hiện việc này. Thuộc tính SecurityProtocol chỉ được sử dụng bên trong lớp nội TlsStream ở một nơi:

enter image description here

TlsStream dường như sao lưu tất cả các kết nối TLS nội bộ chẳng hạn như HTTP, FTP và SMTP.

Tôi đã hy vọng rằng ServicePoint cho phép bạn định cấu hình này. Đối với nhiều cài đặt, ServicePointManager chỉ cung cấp cài đặt mặc định. Hy vọng đó là vô căn cứ.

Vì vậy, đây là bằng chứng khá mạnh mẽ rằng điều này là không thể. Nó không có bằng chứng, mặc dù.

Bạn nên làm gì? Tôi muốn chuyển thư viện máy khách HTTP cho máy chủ lẻ mà bạn đang nói đến. HTTP không phải là một giao thức đặc biệt phức tạp. Tôi chắc rằng có một số triển khai khác có sẵn.

Hoặc, sử dụng proxy để chấm dứt kết nối HTTPS trên máy chủ của riêng bạn. .NET sau đó chỉ giao dịch với HTTP.

+0

cảm ơn vì đã xem xét điều này. Thật không may kết nối máy chủ lẻ (đám mây) được đưa vào SDK, và tôi thậm chí không có quyền truy cập vào phương pháp được sử dụng, hãy để một mình biết nếu 'HttpClient' Nó sẽ mất rất nhiều công việc để làm việc lại tất cả các kết nối khác của tôi để sử dụng một ứng dụng khách khác - và tôi thích sử dụng HttpClient ... Điều đó nói rằng, tôi đánh giá cao câu trả lời này, nó rất hữu ích! :) – Porschiey

3

Bạn không cần thay đổi. bạn có thể sử dụng

ServicePointManager.SecurityProtocol | = SecurityProtocolType.Tls12;

+0

Tuyệt vời, giải quyết vấn đề của tôi với PayPal :) –

Các vấn đề liên quan