我遇到了一个棘手的通信问题,这个应用程序运行在Windows Mobile智能手机上的.NET Compact Framework 3.5上。
我正在使用以下代码构造web请求:
UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] Data = encoding.GetBytes(HttpUtility.ConstructQueryString(parameters));
httpRequest = WebRequest.Create((domain)) as HttpWebRequest;
httpRequest.Timeout = 10000000;
httpRequest.ReadWriteTimeout = 10000000;
httpRequest.Credentials = CredentialCache.DefaultCredentials;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = Data.Length;
Stream SendReq = httpRequest.GetRequestStream();
SendReq.Write(Data, 0, Data.Length);
SendReq.Close();
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
return httpResponse.GetResponseStream();
web服务的功能是接收JSON编码的文档作为URL的一部分(例如。
https://site.com/ws/sync??document=
{“version”:“1.0.0”,“items”:[{“item_1”:“item1”}}}&user=usr&password=pw),并作为响应接收另一个JSON文档作为响应数据。
这段代码在运行WM 5和WM 6的所有模拟器和pda上运行良好。我们已经看到一些客户在运行Treo智能手机时出现了问题(而且只在Sprint网络上)。我们已经在AT&T网络上的同一设备上(通过DeviceAnywhere)测试了代码,并且代码再次按预期工作。
这在电话上肯定是某种安全策略,但我们一直无法确定解决方法或彻底诊断,因为我们无法在内部复制它,不得不求助于让用户帮助我们运行测试驱动程序。
执行此代码时,用户的设备引发以下异常:
System.Net.WebException系统.Net.WebException
无法为SSL/TLS建立安全通道
堆栈跟踪:位于System.Net.HttpWebRequest.finishGetRequestStream()
位于System.Net.HttpWebRequest.GetRequestStream()
在OurApp.GetResponseStream(字符串域,哈希表参数)
内部异常:
System.IO.IO异常
身份验证失败,因为远程方已关闭传输流。
堆栈跟踪:位于System.Net.SslConnectionState.ClientSideHandshake()
在System.Net.SslConnectionState.performClientAndShake()上
在System.Net.Connection.connect上(忽略对象)
在System.Threading.ThreadPool.WorkItem.doWork(对象o)
在System.Threading.Timer.ring()
检查服务器Apache日志显示没有来自用户IP的点击-我认为设备甚至没有在失败之前尝试发送数据包。
如果相关,服务器在Linux上运行Apache,并使用TurboGears Python框架编写。
服务器证书由CA颁发,并且仍然有效。
从中复制此错误的测试驱动程序不是代码签名的,但是相同的错误(没有错误消息)是用GeoTrust证书签名的,因此我们不认为这是代码签名问题。
该应用程序在所有手机上安装和启动都没有问题—它只是为这些用户建立了中断的SSL连接。
故障排除中的一个重要问题是,每次我们尝试解决方案时都会带来很大的不便(需要找到一个“志愿者”客户),因此我们确实在寻找一个银弹,或者更好地理解握手过程,这样我们就可以合理地确信我们只需要让用户再测试一两次。
最后一点:我们已经尝试了通过ActiveSync和GPRS同步,结果完全相同。
任何想法都将不胜感激!