Подключение к веб-сервисам 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’у под определенным логином/паролем, вам надо заменить вот эту строчку
на такую:
Код
Сперва несколько операторов using (включая два пространства имен для reference’ов) и тело консольного приложения:
using System.Net;
using testApp.CustomerPageRef;
using testApp.SystemServiceRef;
namespace testApp
{
class Program
{
static void Main(string[] args)
{
// main program code
}
}
}
Далее идет основной код
Во-первых, подключаемся к веб-сервису System и получаем список фирм:
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 следующим образом:
Console.WriteLine("\nURL of Customer Page: " + customerPageURL);
а затем создаем service-класс к Customer Page:
customerService.Url = customerPageURL;
customerService.UseDefaultCredentials = true;
Используя его, читаем данные по клиенту 10000 и выводим его название:
Console.WriteLine("\nName of Customer 10000: " + cust10000.Name);
Ну и в конце – давайте создадим фильтр и выведем только клиентов из Англии со складами RED или BLUE:
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.