Сетевое программирование в .NET Compact Framework
Обновлен: Ноябрь 2007
.NET Compact Framework предоставляет встроенную поддержку веб-служб XML, а также следующих протоколов и функциональных возможностей:
Протоколы HTTP.
Проверка подлинности NTLM.
XML содержимое с кодировкой SOAP. Эта поддержка включает передачу наборов данных ADO.NET.
Методы веб-запроса и веб-ответа, которые могут отправлять сообщения HTTP SOAP и получать сообщения SOAP в ответе.
Библиотеки SOAP и методы, которые могут сериализовать и десериализовать вызовы методов и произвольные объекты в сообщения и из сообщений XML SOAP.
HTTP-запросы
Следующие элементы относятся к передаче и получению HTTP-запросов:
Если применяется эмулятор, не используйте localhost в качестве имени сервера. Укажите имя компьютера или IP-адрес компьютера разработчика, на котором размещена веб-служба.
Эмулятор, как устройство, имеет собственный IP-адрес. Использование имени localhost дает инструкцию эмулятору самому подключаться к веб-службе вместо веб-службы, размещенной средой разработки или другим компьютером.
Например, вместо:
https://localhost/myWebService/Service1.asmx
Укажите следующее:
http://ComputerName/myWebService/Service1.asmx
При создании HTTP-запроса с помощью HttpWebRequest устройство инициирует новое сетевое подключение, если оно недоступно. Поэтому в результате создания HTTP-запроса только для того, чтобы определить, доступно ли подключение, устройство может пытаться инициировать подключение, например, GPRS.
.NET Compact Framework не сохраняет сведения о прокси в свойстве GlobalProxySelection.Select, но использует это свойство для HTTP-подключений, если значение указано в коде.
Для подключения к Интернету необходимо указать локальные настройки прокси. В следующем коде показаны настройки прокси для порта 80:
System.Net.GlobalProxySelection.Select = new WebProxy("http://myproxy:80");
Если для свойства AllowWriteStreamBuffering установлено значение false, данные не сохраняются в буфере памяти и не поддерживают запросы веб-сервера о проверке подлинности или перенаправлении.
Для успешного выполнения операций указывайте сведения абсолютного пути.
Обратите внимание на следующее поведение Windows CE в разрешении имен файлов:
file://myfile разрешается как \\myfile.
file:///myfile разрешается как \myfile в корневом каталоге.
К известной проблеме относится вызов исключения методом Dns.GetHostName платформы .NET Framework, когда на компьютере установлено больше 50 сетевых протоколов.
Чтобы решить эту проблему, удалите неиспользуемые сетевые протоколы. Удалить протоколы можно, например, с помощью диспетчера устройств Windows. Также можно удалить приложения, которые содержат установленные протоколы.
Безопасное взаимодействие мобильных устройств
Имеются два основные средства для обеспечения безопасности взаимодействия мобильных устройств:
Проверка подлинности HTTP
.NET Compact Framework поддерживает обычную и краткую проверку подлинности. Это простые механизмы проверки подлинности, и их безопасность и компромиссы хорошо известны — одним из них является ограничение веб-служб для привязки HTTP.
.NET Compact Framework версии 2.0 поддерживает серверы, на которых выполняется проверка подлинности NTLM или Kerberos (встроенная проверка подлинности Windows), для которой не требуются изменения кода в соответствии с существующей основной или краткой проверкой подлинности.
Настраиваемые заголовки безопасности
В настоящее время .NET Compact Framework не поддерживает WS-Security и WSE.
Кроме того, при проверке подлинности с помощью HTTP или настраиваемого заголовка, можно использовать протокол SSL для повышения безопасности. При основной проверке подлинности имя и пароль передаются открытым текстом, что не является безопасным без использования протокола SSL. Однако в сочетании с SSL обеспечивается должный уровень безопасности, и остается только одна значительная проблема — вероятность случайного раскрытия учетных данных на конечном сервере.
Примечание .NET Compact Framework не поддерживает проверку подлинности на стороне клиента с помощью сертификатов X509.
Замечания относительно длины содержимого
При потоковой передаче веб-запросов HTTP с помощью протокола POST необходимо указать длину содержимого. Предположим, что свойство SendChunked имеет значение false и Method = POST, укажите значение для ContentLength.
В отличие от полной версии .NET Framework платформа .NET Compact Framework не поддерживает предварительную буферизацию данных из соображений ограничения выделения памяти. Чтобы выполнить буферизацию, установите для свойства 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