【发布时间】:2021-03-24 20:12:19
【问题描述】:
我有一个 Windows 应用商店应用,它是 WinRT 电话/桌面应用(即不是 UWP 应用),面向 Windows 8.1 及更高版本。
它已经在商店上架好几年了,但最近它无法使用 HTTPS 连接各种 Web API 和网站(YouTube 以及我自己的网站)。
我也有这个应用程序的 WPF 版本,最近该应用程序也发生了这种情况,为了修复它,我使用了System.Net.ServicePointManager。不幸的是,在我的 WinRT 环境中,System.Net 不包括ServicePointManager。在我的 WPF 应用程序中,我这样做了,并且效果很好:
ServicePointManager.ServerCertificateValidationCallback = delegate
{
Debug.WriteLine("returning true (the ssl is valid)");
return true;
};
// our server is using TLS 1.2
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
在围绕 Internet 进行一些研究时,似乎 .NET 4.6 应该包含 ServicePointManager,但我没有看到任何方法可以在 WinRT 开发环境中更改(甚至看到)我的 .NET 版本。
我又看了一些,发现StreamSocket 可用于连接 TLS1.2...但这似乎主要用于启用蓝牙通信或与 Web 端点的通信,但 只能通过主机名 ...这对我来说是不够的。我需要连接到一个实际的网站,而不仅仅是基础级域。
尝试这个,我做了以下事情:
StreamSocket socket = new StreamSocket();
string serverServiceName = "https";
socket.Control.KeepAlive = false;
url = "inadaydevelopment.com";
HostName serverHost = new HostName(url);
await socket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.Tls12);
text = await ReadDataFromSocket(socket);
如有必要,我可以包含ReadDataFromSocket() 的代码,但它似乎可以正常工作,当我将其指向https://google.com 时,它可以按预期从套接字读取数据。但是,我似乎无法弄清楚如何将套接字指向任何有用的东西。 inadaydevelopment.com 的主页不是我想要的;我希望使用托管在该服务器上的 Web API,但似乎找不到方法。
由于ConnectAsync() 方法的第一个参数只是HostName,第二个参数(remoteServiceName) 必须是连接到我尝试连接的实际API 或网页的方式。根据the docs,即The service name or TCP port number of the remote network destination...,除了https 和各种数值之外,我没有看到此参数的任何示例值,这两者都不会让我进入我正在尝试的API 端点或网页连接到。
所以,在结束了超长的序言之后,我的问题归结为这个:
我是否可以像在 WPF 应用程序中那样在 WinRT 应用程序中使用 System.Net.ServicePointManager?如果有,怎么做?
如果没有,我如何使用StreamSocket 连接到我想连接的确切网络服务或网页,而不仅仅是顶级主机?
如果这不可行,我可以通过哪些其他方式使用 TLS1.2 消费网页内容?
提前感谢您的任何帮助或建议。
【问题讨论】:
标签: windows-runtime tls1.2 winrt-async stream-socket-client servicepointmanager