WebClient忽略了ServicePointManager.ServerCertificateValidationCallback?

时间:2014-12-01 09:28:06

标签: c# asp.net-mvc ssl webclient

我使用WebClient从我的MVC5项目中获取外部网站的数据:

        using (var client = new WebClient())
        {
            var result = client.DownloadString(url);

            return this.Content(result);
        }

但是,请求的URL使用TLS,但我们处于开发阶段,因此他们使用自己的证书,这显然不合法。因此,我收到了这个例外:

[IOException: Authentication failed because the remote party has closed the transport stream.]
   System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) +6587998
   System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) +132
   System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) +59
   System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) +247
   System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) +137
   System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) +119
   System.Net.TlsStream.CallProcessAuthentication(Object state) +38
   System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +166
   System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +21
   System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) +64
   System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) +797
   System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) +52
   System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) +19
   System.Net.ConnectStream.WriteHeaders(Boolean async) +142

我已阅读了很多其他文章,因此我在Global.asax Application_Start方法中添加了这些代码:

        System.Net.ServicePointManager.ServerCertificateValidationCallback =
            (s, cert, chain, sslPolicyErrors) =>
            {
                return true;
            };

然而,结果保持不变。我甚至尝试将断点放在Callback设置行,并在return true行放置1。在开始时,断点被命中为有意。但是,当WebClient调用时,return true行的断点永远不会被命中。

WebClient是否使用其他CallBack方法?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题是你必须添加这样的东西

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

但这取决于它支持哪种协议。你可以在这里查看 https://www.ssllabs.com

这个结果对我来说是来自这个网站 协议

  

TLS 1.2是TLS 1.1是TLS 1.0否SSL 3否SSL 2否