.NET Compact Framework のネットワーク プログラミング
更新 : 2007 年 11 月
.NET Compact Framework では、XML Web サービスの組み込みサポートを用意しています。また、次に示すプロトコル サポートと機能も用意しています。
HTTP ベースのプロトコル。
NTLM 認証。
SOAP エンコードされた XML コンテンツ。このサポートには、ADO.NET データセットの受け渡しも含まれます。
HTTP SOAP メッセージを送信できる Web 要求メソッドと、それに応じた SOAP メッセージを受信できる Web 応答メソッド。
XML SOAP メッセージとの間で、メソッド呼び出しと任意のオブジェクトのシリアル化および逆シリアル化を実行できる、SOAP ライブラリとメソッド。
HTTP 要求
次の項目は、HTTP 要求の送受信に関連しています。
エミュレータを使用するときは、サーバー名として 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.Select プロパティにプロキシ情報は格納されませんが、コードで値を指定した場合は、このプロパティが HTTP 接続に使用されます。
場合によっては、インターネットに接続するためにローカル プロキシ設定を指定する必要があります。次のコードは、ポート 80 のプロキシの設定です。
System.Net.GlobalProxySelection.Select = new WebProxy("http://myproxy:80");
AllowWriteStreamBuffering を false に設定すると、データはメモリ内のバッファに格納されず、Web サーバーによる認証要求またはリダイレクトはサポートされません。
正常に処理するには、絶対パス情報を指定してください。
相対ファイル指定を解決する場合には、次の Windows CE の動作に注意してください。
file://myfile は、 \\myfile として解決されます。
file:///myfile は、ルート ディレクトリ内の \myfile として解決されます。
現在のコンピュータにインストールされているネットワーク プロトコルが 50 個を超えると、.NET Framework の Dns.GetHostName メソッドによって例外がスローされることは既知の問題です。
この問題を回避するには、実際には必要ではないネットワーク プロトコルをアンインストールします。このための 1 つの方法は、Windows のデバイス マネージャを使用して未使用のネットワーク アダプタを削除することです。別の方法としては、プロトコルをインストールしたアプリケーションをアンインストールします。
セキュリティで保護されたモバイル通信
基本的に、セキュリティで保護されたモバイル通信には 2 つの手段があります。
HTTP 認証
.NET Compact Framework では、基本認証およびダイジェスト認証がサポートされています。これらの認証メカニズムは単純であり、それらのセキュリティとトレードオフはよく知られています。トレードオフの 1 つとして、Web サービスが HTTP バインディングに制限されている点が挙げられます。
.NET Compact Framework Version 2.0 では、NTLM または Kerberos (Windows 統合認証) を実行しているサーバーがサポートされます。既存の基本認証またはダイジェスト認証に対するコード変更は必要ありません。
カスタム セキュリティ ヘッダー
.NET Compact Framework では、現在、WS-Security (Web Services Security) および WSE (Web Service Enhancements) をサポートしていません。
さらに、HTTP とカスタム ヘッダーのどちらを使用して認証するかに関係なく、SSL を使用してセキュリティを強化できます。基本認証は、クリア テキストで名前とパスワードを渡すため、SSL 内部から実行する場合を除いて、あまり安全ではありません。ただし、SSL と併せて使用すると、適切にセキュリティで保護されるので、対象のサーバーに資格情報が誤って公開されるという重要な問題を防ぐことができます。
メモ .NET Compact Framework では、X509 証明書を使用したクライアント側の認証はサポートしていません。
内容の長さに関する考慮事項
ストリーム転送された内容の HTTP Web 要求を POST プロトコルを使用して送信するときは、その内容のサイズを指定する必要があります。SendChunked が false で Method = POST の場合は、ContentLength の値を指定します。
.NET Framework とは異なり、.NET Compact Framework では、メモリ制約を考慮して、データの事前バッファリングは行いません。バッファリングを確実に行うためには、SendChunked を false に設定します。
内容の長さが 0 である要求ストリームは、それが正しく取得され、閉じられなかった場合に、ObjectDisposedException を引き起こします。内容の長さが 0 である要求を処理するには、次のコード例に示すように、返されたストリームに対して、Write メソッドを呼び出すことなく、明示的に GetRequestStream メソッド、次に Close メソッドを呼び出す必要があります。
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