C# 在Windows Mobile中管理网络状态的最佳方法
我有一个.NET Compact Framework 3.5程序,用作“偶尔连接的”业务线(LOB)应用程序。如果它可以看到一个在线Web服务,它将使用它来访问数据,但如果网络连接丢失,它将使用本地缓存 处理所有连接选项和状态更改的最佳方法是什么C# 在Windows Mobile中管理网络状态的最佳方法,c#,windows-mobile,compact-framework,C#,Windows Mobile,Compact Framework,我有一个.NET Compact Framework 3.5程序,用作“偶尔连接的”业务线(LOB)应用程序。如果它可以看到一个在线Web服务,它将使用它来访问数据,但如果网络连接丢失,它将使用本地缓存 处理所有连接选项和状态更改的最佳方法是什么 OpenNetCF的ConnectionManager类 Microsoft.WindowsBile.State.SystemState API调用 您如何让it部门了解WiFi、摇篮和GPRS之间的区别,并使用可用的最佳方法 有人对此有任何指导吗
- OpenNetCF的ConnectionManager类
- Microsoft.WindowsBile.State.SystemState
- API调用
SystemState只是关于连接的状态。您可以通过ConnectionManager使用特定的连接。我建议你读这本书。如果您使用的是.NET Compact Framework 3.5,则会包含一个托管API。您也可以使用OpenNetCF ConnectionManager。我只是创建了一个简单的共享类,我可以这样调用它:
If MyConnectionClass.IsConnected then
'Do connected stuff
Else
'Do local save
End If
Public ReadOnly Property IsConnected As Boolean
Get
Try
Dim HostName As String = Dns.GetHostName()
Dim thisHost As IPHostEntry = Dns.GetHostByName(HostName)
Dim thisIpAddr As String = thisHost.AddressList(0).ToString
return (thisIpAddr <> Net.IPAddress.Parse("127.0.0.1").ToString())
Catch ex As Exception
Return False
End Try
End Get
End Property
然后,我所有的实际业务类/函数都可以使用它来隐藏UI代码中的这些污点
MyConnectionClass的IsConnected属性将具有如下内容:
If MyConnectionClass.IsConnected then
'Do connected stuff
Else
'Do local save
End If
Public ReadOnly Property IsConnected As Boolean
Get
Try
Dim HostName As String = Dns.GetHostName()
Dim thisHost As IPHostEntry = Dns.GetHostByName(HostName)
Dim thisIpAddr As String = thisHost.AddressList(0).ToString
return (thisIpAddr <> Net.IPAddress.Parse("127.0.0.1").ToString())
Catch ex As Exception
Return False
End Try
End Get
End Property
要使用它,请执行以下操作:
public void DoTcpConnection()
{
string url = "www.msn.com";
bool res = GPRSConnection.Setup("http://" + url + "/");
if (res)
{
TcpClient tc = new TcpClient(url, 80);
NetworkStream ns = tc.GetStream();
byte[] buf = new byte[100];
ns.Write(buf, 0, 100);
tc.Client.Shutdown(SocketShutdown.Both);
ns.Close();
tc.Close();
MessageBox.Show("Wrote 100 bytes");
}
else
{
MessageBox.Show("Connection establishment failed");
}
}
这是Anthony Wong的博客:
请记住,您只需要在较低级别的TCP或UDP内容中使用它。HTTPRequests不需要这个。我尝试编写移动应用程序,这样他们甚至不知道涉及到网络。我在本地保存足够好的验证数据,然后将事务写入本地队列,该队列在连接时清除;队列读取器包括一个计时器,用于在未连接时重试。队列消息是双向的,因此也可以提供本地刷新。基本消息队列模式
这使我能够以最简单的方式处理网络连接,使用基本的套接字打开/关闭/读/写/ioctl逻辑,这种逻辑具有高度的可移植性;而且你的关系根本不需要持续很长时间。(我不想想象过去几年中,为了与所有MS体系结构变化保持同步,需要做些什么——这一点我还没有解决。)我发现Microsoft.WindowsMobile.State.SystemState报告网络连接是不可靠的。这是6.0和更早的版本。我没有进行详尽的测试,但当有连接时,它会说没有连接时,它被放弃了。我如何使用SystemState来告诉它尝试连接(即,如果可用,启动GPRS)?我如何告诉它尝试连接(即,如果可用,启动GPRS)?发布的方法(和链接)似乎只是一个地址,似乎是连接打开或关闭的WiFi。我非常同意你所写的,我有一个移动应用程序,当WiFi不存在时,将切换到使用短信作为协议。这很容易做到,因为我在CLSA for CE中内置了一个基于“消息队列”的xfer系统。我希望我能继续使用它,但那个项目放弃了电话选项=(