Подключение к веб-сервисам NAV из C# с помощью Web Reference

Предыстория

Пожалуйста, ознакомьтесь с этой заметкой, чтобы получить представление о сценарии, который я собираюсь реализовать на C# с помощью Web Reference’ов.

Что касается аутентификации, то для C# можем запускать сервер приложений с Negotiate, или с NTLM (как в PHP и Java).

В своем примере я предполагаю, что сервер приложений будет использовать SPNEGO (т.е. по умолчанию).

Кроме того, для понимания вещей, излагаемых в заметке, необходимо базовое знание самого C# :-)

Версии ПО и источники для скачивания

При написании этого примера я работал с Visual Studio 2008 Professional SP1, но, по правде говоря, даже НЕ ПЫТАЛСЯ проверить, работает ли он на Express-версиях Visual Studio. В них возможна работа с Service Reference, т.ч. не вижу причин, по которым не будут работать Web Reference’ы.

В чем разница между Web Reference и Service Reference?

Вкратце, Web Refence – это .NET 2.0 – совместимая структура, а Service Reference – основанная на WCF .NET 3.5 – совместимая структура.

Add Web Reference – обертка над wsdl.exe и может использоваться для создания прокси для клиентов .NET 1.1 и 2.0. Этозначает, чтобы при ссылке на WCF-сервис вам надо будет сослаться на endpoint, использующий basicHttpBinding.

Add Service Reference – обертка svcutil.exe и тоже – создает прокси на клиенте. Созданные им прокси могут использоваться только клиентами на .NET 3.5.

Как добавить Web Reference

Выберите Add Service Reference

Щелкните Advanced

Щелкните Add Web Reference

Введите URL и укажите пространство имен (namespace) для SystemService Web Reference

А также для Customer Page Web Reference

При добавлени web reference’а, Visual Studio создает конфиг-файл, в котором хранит разные вещи наподобие URL для Reference’а. В своем примере я присваиваю URL из кода, поэтому конфиг-файл не требуется.

Аутентификация

В следующем примере я использую Windows-аутентификацию. При работе c web references вам достаточно указать true для свойства UseDefaultCredentials в сервис-классе, а .net автоматически попытается использовать ваши права в Windows для подключения к веб-сервису.

При необходимости подключения к web reference’у под определенным логином/паролем, вам надо заменить вот эту строчку

someService.UseDefaultCredentials = true;

на такую:

someService.Credentials = new NetworkCredential("user", "password", "domain");

Код

Сперва несколько операторов using (включая два пространства имен для reference’ов) и тело консольного приложения:

using System;
using System.Net;
using testApp.CustomerPageRef;
using testApp.SystemServiceRef;

namespace testApp
{
  class Program
  {
    static void Main(string[] args)
    {
      // main program code
    }
  }
}

Далее идет основной код
Во-первых, подключаемся к веб-сервису System и получаем список фирм:

string baseURL = "http://localhost:7047/DynamicsNAV/WS/";
SystemService systemService = new SystemService();
systemService.Url = baseURL + "SystemService";
systemService.UseDefaultCredentials = true;

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

Теперь в переменной cur у меня хранится название фирмы, с которой будем работать. Создаем URL на CustomerPage следующим образом:

string customerPageURL = baseURL + Uri.EscapeDataString(cur) + "/Page/Customer";
Console.WriteLine("\nURL of Customer Page: " + customerPageURL);

а затем создаем service-класс к Customer Page:

Customer_Service customerService = new Customer_Service();
customerService.Url = customerPageURL;
customerService.UseDefaultCredentials = true;

Используя его, читаем данные по клиенту 10000 и выводим его название:

Customer cust10000 = customerService.Read("10000");
Console.WriteLine("\nName of Customer 10000: " + cust10000.Name);

Ну и в конце – давайте создадим фильтр и выведем только клиентов из Англии со складами RED или BLUE:

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";

Console.WriteLine("\nCustomers 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)
    Console.WriteLine(customer.Name);

Console.WriteLine("\nTHE END");
Console.ReadLine();

Результаты будут выведены в консоли (на моей машине с запущенным NAV 2009SP1 W1)

Надеюсь, статья поможет вам в работе.
Удачи!
Оригинал статьи доступен по адресу: http://blogs.msdn.com/b/freddyk/archive/2010/01/20/connecting-to-nav-web-services-from-c-using-web-reference.aspx

Автор:

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

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

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