.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

請參閱

其他資源

.NET Compact Framework 中的網路和連接