Подключение к веб-сервисам NAV из Windows Mobile 6

Я сделал свое самое первое приложение для Windows Mobile!

Она работает на эмуляторе из Professional SDK.

Кроме того, я попробовал развернуть свое приложение на реальном устройстве (своем смартфоне), и у меня получилось:

Сказать по правде, самое сложное – провести начальную настройку, чтобы можно было работать.

Несколько полезных ссылок для понимания процесса

Windows Mobile 6 SDK можно скачать здесь: http://www.microsoft.com/downloads/details.aspx?FamilyID=06111a3a-a651-4745-88ef-3d48091a390b&DisplayLang=en

Windows Mobile 6 SDK не включен в поставку Visual Studio 2008, так что его надо скачать и установить отдельно.

Создание вашего первого приложения под WM6: http://code.msdn.microsoft.com/WM6YourFirstApp

Это неплохой видеоролик для начинающих.

Windows Mobile Development Center: http://msdn.microsoft.com/en-us/windowsmobile/default.aspx

По этому адресу можно найти много хороших ссылок для начинающих, а также всяких «How to».

Security Configuration Manager: C:\Program Files\Windows Mobile 6 SDK\Tools\Security\Security Powertoy

Как только вы установили SDK – откройте эту папку и поставьте Security Configuration Manager для настройки своего устройства – это нужно для того разворачивания приложения и его отладки.

Примечание: я немного повоевал, чтобы получить доступ к сети с устройства и с эмулятора, но как только настроил сетевой доступ для эмулятора (подключение к интернету – не к рабочей сети), а также доступ к своей машине через файервол – все работало отлично.

Сценарий использования

Пожалуйста, прочитайте мою заметку про this post… чтобы получить представление о том, что именно будет реализовано на WM-устройстве.

.net 3.5

Для создания приложения будем использовать .NET 3.5 Compact Framework, неважно – Professional или Standard.

Первое, что надо сделать – создать в моем приложении 2 ссылки (Web Reference’а) к двум веб-сервисам, которые буду использовать – SystemService (SystemServiceRef) и CustomerPage (CustomerPageRef).

Эти ссылки довольно похожи на ссылки из обычного .NET framework’а (можно глянуть здесь this post). Единственное, на что надо обратить внимание – в compact framework нет свойства UseDefaultCredentials, так что при подключении к веб-сервисам Navision потребуется указать имя пользователя и пароль.

Тип проекта будет – Device Application, а в форму добавим следующий код:

using System;
using System.Windows.Forms;
using SmartDeviceProject4.SystemServiceRef;
using SmartDeviceProject4.CustomerPageRef;
using System.Net;

namespace SmartDeviceProject4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

string baseURL = "http://<IP>:7047/DynamicsNAV/WS/";
NetworkCredential credentials = new NetworkCredential(user, password, domain);

SystemService systemService = new SystemService();
systemService.Credentials = credentials;
systemService.Url = baseURL + "SystemService";
systemService.PreAuthenticate = true;

display("Companies:");
string[] companies = systemService.Companies();
foreach (string company in companies)
display(company);
string cur = companies[0];

string customerPageURL = baseURL + Uri.EscapeDataString(cur) + "/Page/Customer";
display("");
display("URL of Customer Page:");
display(customerPageURL);

Customer_Service customerService = new Customer_Service();
customerService.Credentials = credentials;
customerService.Url = customerPageURL;
customerService.PreAuthenticate = true;

Customer customer10000 = customerService.Read("10000");
display("");
display("Name of customer 10000:");
display(customer10000.Name);

Customer_Filter filter1 = new Customer_Filter();
filter1.Field = Customer_Fields.Country_Region_Code;
filter1.Criteria = "GB";

Customer_Filter filter2 = new Customer_Filter();
filter2.Field = Customer_Fields.Location_Code;
filter2.Criteria = "RED|BLUE";

display("");
display("Customers in GB served by RED or BLUE warehouse:");
Customer_Filter[] filters = new Customer_Filter[] { filter1, filter2 };
Customer[] customers = customerService.ReadMultiple(filters, null, 0);
foreach (Customer customer in customers)
display(customer.Name);

display("");
display("THE END");
}

private void display(string s)
{
this.textBox1.Text += s + "\r\n";
}
}
}

На 99% этот код повторяет код из статьи про подключение к веб-сервисам из C# (ссылку в студию). Основные различия в baseURL (это, само собой, не localhost, т.к. localhost – это само устройство), ну и то, что я написал про права в начале.

Но… как же оно медленно работает!

После того, как вы заставите свой смартфон заработать, обнаружите одну неприятную вещь – веб-сервисы с мобильного устройства жутко тормозят.

Вызов сервиса для чтения данных по клиенту 10000 занимает около полутора секунд, и это время не улучшишь, даже запустив его 100 раз подряд.

При установке свойства Service.preAuthenticate в TRUE, время улучшается до 1,2 секунды, что все равно медленнее, чем хотелось бы.

Я попробовал создать стандартный .NET веб-сервис на своей хост-машине (простой asmx веб-сервис из серии Hello World!), и вызвал его 100 раз подряд, время упало примерно до полсекунды, что тоже очень медленно, но уже приемлемо.

Далее, попробовав запустить вызов этого сервиса (с авторизацией) из других приложений, получил среднее время в 0,04 секунды, т.е. при работе с мобильным устройством мы наблюдаем примерно 30-кратное падение производительности.

Решив продолжить, я заставил свое приложение Hello World! Возвращать 10Кбайт-ную строку – но это вообще не повлияло на быстродействие – а увеличение размеров строки до 40Кбайт – время поползло вверх до 0,7 с на запрос. Похоже, основная проблема в каких-то задержках (могу только гадать по этому поводу).

Я еще проведу небольшое расследование на эту тему – включая обращение в Microsoft Mobile Team – чтобы выяснить причину, и можно ли это как-то починить (если можно вообще).

На текущий момент решение примерно такое – создать прокси (с очень ограниченным набором инструкций – один метод на каждую высокоуровневую вещь, которую надо делать на мобильном устройстве). Он должен работать вообще без аутентификации. Мобильные устройства должны подключаться к нему, используя, например, IP-security со стороны веб-сервиса, либо «poor mans authentication» (прим. – не понял, что это).

Надеюсь, статья поможет в вашей работе.

Удачи!

Оригинал статьи находится здесь: http://blogs.msdn.com/b/freddyk/archive/2010/01/22/connecting-to-nav-web-services-from-windows-mobile-6.aspx

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Комментарии (Один комментарий)

Добавить комментарий