我有一个Windows Store应用程序,它是一个WinRT手机/桌面应用程序(即不是UWP应用程序),针对Windows 8.1及以上版本。该应用已经在商店上架多年,但最近无法使用HTTPS连接各种Web API和网站(包括YouTube以及我的网站)。我还有一个WPF版本的这个应用程序,最近这个应用程序也发生了同样的问题,为了解决它,我使用了System.Net.ServicePointManager。不幸的是,在我的WinRT环境中,System.Net不包括ServicePointManager。在我的WPF应用程序中,我使用了相同的方法,运行良好。
在对互联网进行研究时,似乎.NET 4.6应该包含“ServicePointManager”,但我在WinRT开发环境中没有看到任何更改(甚至无法查看)我的.NET版本的方法。
我继续查找并发现可以使用“StreamSocket”与TLS1.2连接......但这似乎主要是设计用于启用蓝牙通信或通过主机名连接到Web端点,而这对我来说是不够的。我需要连接到一个实际的网站,而不仅仅是基本级别的域名。
为了尝试这个,我做了以下事情:
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;
在对互联网进行研究时,似乎.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或网页的方式。根据文档,它是远程网络目标的服务名称或TCP端口号...
我还没有看到这个参数的任何示例值,除了https
和各种数值,这两个值都无法让我到达我正在尝试连接的API端点或网页。
那么,经过这么长的前言,我的问题可以简化为这个:
在我的WinRT应用程序中,是否有一种使用System.Net.ServicePointManager
的方法,就像我在我的WPF应用程序中那样?如果是,如何实现?
如果不行,如何使用StreamSocket
连接到我想要连接的确切网络服务或网页,而不仅仅是顶级主机?
如果这不可能,还能通过其他方式使用TLS1.2来消耗Web内容吗?
提前感谢任何帮助或建议。