我对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和6的所有仿真器和PDA上运行良好。我们已经看到一些运行Treo智能手机的客户(并且仅在Sprint网络上)存在问题。我们已经在AT& T网络上的相同设备上测试了代码(通过DeviceAnywhere),代码再次按照我们的预期运行。
这必须是电话上的某种安全策略,但我们无法确定解决方法或彻底诊断它,因为我们无法在内部重现它并且不得不求助于用户协助运行测试我们的司机。
执行此代码时,用户的设备会抛出以下异常:
System.Net.WebException
无法为SSL / TLS建立安全通道
堆栈跟踪:在System.Net.HttpWebRequest.finishGetRequestStream()
在System.Net.HttpWebRequest.GetRequestStream()
在OurApp.GetResponseStream(String domain,Hashtable参数)
内部例外:
System.IO.IOException
身份验证失败,因为远程方已关闭传输流
堆栈跟踪:在System.Net.SslConnectionState.ClientSideHandshake()
在System.Net.SslConnectionState.PerformClientHandShake()
在System.Net.Connection.connect(忽略对象)
在System.Threading.ThreadPool.WorkItem.doWork(Object o)
在System.Threading.Timer.ring()
检查服务器Apache日志显示没有来自用户IP的命中 - 我不认为设备甚至在尝试发送数据包失败之前。 如果相关,服务器在Linux上运行Apache,并使用TurboGears Python框架编写。
服务器证书由CA颁发,仍然有效。 复制此错误的测试驱动程序未进行代码签名,但是使用GeoTrust证书签署了相同的错误(没有错误消息),因此我们认为这不是代码签名问题。
应用程序在所有手机上安装和启动都没有问题 - 它只是为这些用户建立了这种SSL连接。
故障排除中的一个重要问题是,每次我们尝试解决方案时都会带来很大的不便(需要找到“志愿者”客户),所以我们真的在寻找灵丹妙药或更好地理解握手因此我们可以合理地确信我们只需要让用户再测试一次或两次。
最后一个提及:我们尝试通过ActiveSync和GPRS进行同步,结果相同。
任何想法都将不胜感激!
答案 0 :(得分:0)
我遇到了与Tomcat服务器相同的问题。
在我的Tomcat连接器(server.xml)中使用SSLProtocol =“all”后它就消失了。
我被使用SSLProtocol =“TLSv1”的Tomcat SSL操作方法误导了。这个值适用于移动设备上的IE,但不适用于我的.Net Compact Framework 3.5应用程序。