Підключення до веб-сервісів NAV із Windows Mobile 6, Navision - технології як мистецтво

Я зробив свій перший додаток для Windows Mobile!

windows

Вона працює на емуляторі Professional SDK.

windows

Сказати по правді, найскладніше провести початкове налаштування, щоб можна було працювати.

Декілька корисних посилань для розуміння процесу

Windows Mobile 6 SDK не включений у постачання Visual Studio 2008, так що його треба завантажити та встановити окремо.

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

Як тільки ви встановили SDK – відкрийте цю папку і поставте Security Configuration Manager для налаштування свого пристрою – це потрібно для розгортання програми та її налагодження.

Примітка: я трохи повоював, щоб отримати доступ до мережі з пристрою та емулятора, але як тільки налаштував мережевий доступ для емулятора (підключення до інтернету – не до робочої мережі), а також доступ до своєї машини через фаєрвол – все працювало відмінно.

Сценарій використання

Будь ласка, прочитайте мою замітку про this post… щоб отримати уявлення про те, що саме буде реалізовано на WM-пристрої.

Для створення програми будемо використовувати .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:// :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 = новий Customer_Filter ( ) ; filter1. Field = Customer_Fields. Country_Region_Code; filter1. Criteria = "GB";

Customer_Filter filter2 = новий Customer_Filter ( ) ; filter2. Field =Customer_Fields. Location_Code; filter2. Criteria = "REDBLUE";

display (""); display ( "Customers in GB served by RED or BLUE warehouse:") ; Customer_Filter [ ] filters = новий 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 разів поспіль, час впав приблизно до півсекунди, що теж дуже повільно, але вже прийнятно.

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

Я ще проведу невелике розслідування на цю тему, включаючи звернення до MicrosoftMobile Team – щоб з'ясувати причину, і чи це можна якось полагодити (якщо можна взагалі).

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

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