为什么.Net CF在调用HTTPS 的Web服务时失败
2010-08-30 00:15:00 来源:WEB开发网今天,随便翻阅了一下.net framework compact小组的Blog,发现一篇非常有用的博文,作者是:Andarno,
原文地址是:
http://blogs.msdn.com/andrewarnottms/archive/2007/11/19/why-net-compact-framework-fails-to-call-some-https-web-servers.aspx
下面,小弟就按照自己的理解和词典的解释,把文章翻译过来,和大家一起分享一下关于这个问题的产生原因和解决经验(来自Andarno)吧。
正文:
在.Net CF 2.0(SP2或更早版本)和3.5版本中发现了一个Bug,它主要造成了程序使用HttpWebRequest方法进行HTTPS服务请求失败时,返回的一个提示:(对于Web服务)
System.Net.WebException: Unable to read data from the transport connection. ---> System.Net.Sockets.SocketException: Unknown error (0x0).
at System.Net.HttpWebRequest.fillBuffer(HttpWebRequest request, Connection connection, CoreResponseData data)
at System.Net.HttpWebRequest.getLine(HttpWebRequest request, Connection connection, CoreResponseData data)
at System.Net.HttpWebRequest.parseResponse(HttpWebRequest request, Connection connection, Boolean defaultKeepAlive)
at System.Net.HttpWebRequest.startReceiving(Connection connection)
at System.Net.Connection.startReceiving(Object ignored)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
at System.Net.HttpWebRequest.finishGetResponse()
at System.Net.HttpWebRequest.GetResponse()
// ...
at Program.Main(String[] args)
虽然异常提示的内容以及产生原因是相同的,但是从你的程序中进行标准HttpWebRequest调用时,Stack trace信息将是不同的。
然而,产生这个异常的原因有很多,其中一个原因就是服务端发送了一个空的加密数据包给.NetCF客户端。下面是一个在HTTPS服务端加密的过程图示:
首先,服务端会初始化一个将通过网络要发送到客户端的、未加密的数据包,并存放到Memory Buffer中。