2015-11-10 14 views
8

私のアプリでRestSharpを使用してREST APIとSystem.Net.Mailを照会して電子メールを送信します。プログラムの起動時に、私はServicePointManager.SecurityProtocolプロパティを設定しました。ServicePointManager SecurityProtocol conflict

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls11; 

例外です:

The request was aborted: Could not create SSL/TLS secure channel 

私はプロパティに設定した場合:RestSharpでAPIを照会したときにスローされる

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; 

例外:私はにプロパティを設定した場合

System.Net.Mailで電子メールを送信するとスローされます。

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm 

どのように私はこの問題を解決する必要がありますか?

+0

.NETのどのバージョンですか?あなたが最新のものでないなら、それはアップグレードすることが可能ですか?その後、私はそれを少し狭めようと試み始めます。 chrome addin Postmanを使用してAPIを試してみてください。トラフィックをインターセプトし、パケットを調べて、それが何をネゴシエートしようとしているかを確認するために、Fiddler(またはwireshark)を設定します。また、標準のSmtpClientクラスを使用していますか?あなたのコードはそれを使ってどのように見えますか? – Wjdavis5

+0

コールする直前にサービスポイントマネージャの正しい値を設定できます。 –

答えて

6

RESTのAPIサーバとあなたは明らかに矛盾するセキュリティプロトコル要件を持つように接続されているメールサーバ。あなたはそれらのために異なるセキュリティプロトコル設定を使用する必要があります。

ServicePointManager.SecurityProtocolは静的であり、その電流値は、すべての新しい接続に適用されます。残念ながら、ServicePointごとにこの設定を制御する方法はありません。 (私の意見では、これはMicrosoftの設計上の欠陥です)

REST APIサーバーまたはメールサーバーのいずれかを管理している場合は、競合しないセキュリティプロトコルを受け入れるように再構成することができます。 REST APIおよびメールサーバーへのすべての接続は、2つの別々のAppDomainsから作られるように

そうしないと、あなたはあなたのコードを再設計することができます。

たとえば、デフォルトのアプリケーションドメインは、すべてのREST APIの通信を処理し、すべてのメール通信を行う別のアプリケーションドメインを起動しましょう。

は、この設定を使用すると、各ドメインに異なる ServicePointManager.SecurityProtocol値を使用することができます。 (静的な値はアプリドメイン間で共有されないため)。