我使用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方法?我该如何解决这个问题?
答案 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否