.NET Compact Framework 中的網路程式設計
更新:2007 年 11 月
.NET Compact Framework 提供內建的 XML Web Service 支援,和下列的通訊協定支援與功能:
HTTP 架構的通訊協定
NTLM 驗證
SOAP 編碼的 XML 內容。本項支援包含傳遞 ADO.NET 資料集
可以傳送 HTTP SOAP 訊息與接收回應之 SOAP 訊息的 Web 要求和 Web 回應方法
可以將方法呼叫和任意物件序列化至 XML SOAP 訊息,以及由 XML SOAP 訊息還原序列化方法呼叫和任意物件之 SOAP 程式庫與方法
HTTP 要求
下列項目與傳送和接收 HTTP 要求有關:
當使用模擬器 (Emulator) 時,請勿使用 localhost 當做伺服器名稱。請指定您用以裝載 Web 服務的開發電腦之電腦名稱或 IP 位址。
模擬器如同裝置般,具有自己專屬的 IP 位址。使用 localhost 會指示模擬器自行連接至 Web 服務,而非使用開發環境或另外的桌上型電腦所裝載的 Web 服務。
例如,請勿使用:
https://localhost/myWebService/Service1.asmx
請指定:
http://ComputerName/myWebService/Service1.asmx
當使用 HttpWebRequest 提出 HTTP 要求時,如果沒有可用的連接時,該裝置會啟始新的網路連接。因此,只有在有可用的連接時提出 HTTP 要求以做判斷,會造成裝置嘗試啟始連接,例如 GPRS 連接。
.NET Compact Framework 並未在 GlobalProxySelection.SelectGlobalProxySelection.Select 屬性 (Property) 中儲存 Proxy 資訊,但是如果您在程式碼中指定一個值,則會使用這個屬性進行 HTTP 連接。
若要連接至網際網路,您可能需要指定本機的 Proxy 設定。下列程式碼顯示如何為連接埠 80 設定 Proxy:
System.Net.GlobalProxySelection.Select = new WebProxy("http://myproxy:80");
如果將 AllowWriteStreamBuffering 設定為 false,資料不會緩衝於記憶體,所以不會支援任何驗證要求或 Web 伺服器的重新導向 (Redirection)。
若要確保作業成功,請指定絕對路徑的資訊。
在解決相對檔案規格時,請注意下列的 Windows CE 行為:
file://myfile 會解析為 \\myfile。
file:///myfile 會解析為根目錄中的 \myfile。
一個已知的問題是當目前的電腦上安裝超過 50 個網路通訊協定時,.NET Framework 的 Dns.GetHostName 方法會擲回例外狀況。
若要解決這個問題,請解除安裝並無實際需要的網路通訊協定。這項作業的執行方法之一是使用 Windows 裝置管理員移除未使用的網路卡。另一個方式是解除安裝有安裝通訊協定的應用程式。
安全的行動通訊
要達到安全的行動通訊,基本上有兩種方式:
HTTP 驗證
.NET Compact Framework 支援基本和摘要式驗證。這些驗證機制很簡單,而其安全性和代價則廣為週知,例如 Web 服務只能使用 HTTP 繫結。
.NET Compact Framework 2.0 版會支援執行 NTLM 或 Kerberos (Windows 整合式驗證) 的伺服器,這項驗證技術不需要更改任何現有的基本或摘要式驗證的程式碼。
自訂安全性標頭
.NET Compact Framework 目前不支援 Web Services Security (WS-Security) 和 Web Service Enhancements (WSE)。
此外,不管您使用 HTTP 或自訂標頭進行驗證,都可以使用 SSL 增加安全性。基本驗證會以純文字的形式傳送名稱和密碼,所以除非是從 SSL 內執行,否則並不是很安全,不過,與 SSL 一起使用時就相當安全。值得注意的是,此種方式仍會偶爾意外地將認證透露給目標伺服器。
注意:.NET Compact Framework 不支援使用 X509 憑證進行的用戶端驗證。
內容長度考量
當使用 POST 通訊協定傳送資料流內容 (Streamed Content) 的 HTTP Web 要求時,必須指定內容的長度。假設 SendChunked 是 false,而 Method = POST,請為 ContentLength 指定值。
.NET Compact Framework 不同於完整的 .NET Framework 之處,是在於它不會預先緩衝資料,以符合記憶體條件約束 (Constraint) 的考量。若要確保進行緩衝,請將 SendChunked 設為 false。
內容長度為零的要求串流如果沒有正確地進行取得和關閉,會導致 ObjectDisposedException。若要處理內容長度為零的要求,必須明確呼叫 GetRequestStream 方法,然後在傳回的串流上呼叫 Close 方法 (不呼叫 Write 方法),如下列的程式碼範例所示。
private static void ZeroLengthRequest()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
requestUri + "?dummy=true");
request.AllowWriteStreamBuffering = true;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Credentials = netCred;
request.ConnectionGroupName = "mygroup";
request.ContentLength = 0;
request.KeepAlive = true;
request.Method = "POST";
request.ServicePoint.UseNagleAlgorithm = false;
request.Timeout = System.Threading.Timeout.Infinite;
request.UnsafeAuthenticatedConnectionSharing = true;
Stream req = request.GetRequestStream();
req.Close();
using (request.GetResponse())
{
...
}
}
Private Shared Sub ZeroLengthRequest()
Dim request As HttpWebRequest = _
CType(WebRequest.Create(requestUri + "?dummy=true"), _
HttpWebRequest)
request.AllowWriteStreamBuffering = true
request.Credentials = CredentialCache.DefaultNetworkCredentials
request.Credentials = netCred
request.ConnectionGroupName = "mygroup"
request.ContentLength = 0
request.KeepAlive = true
request.Method = "POST"
request.ServicePoint.UseNagleAlgorithm = false
request.Timeout = System.Threading.Timeout.Infinite
request.UnsafeAuthenticatedConnectionSharing = true
Dim req As Stream = request.GetRequestStream
req.Close
request.GetResponse
End Sub