Подключение к веб-сервисам NAV из Visual Basic.NET при помощи Service Reference
В целом, настоящая заметка – это переписанные на языке Visual Basic статьи «Подключение к веб-сервисам NAV из C# при помощи Service Reference (вариант с написанием кода)» и «», объединенные вместе, так что ознакомьтесь с ними перед чтением этой заметки.
Как уже описывалось в других заметках, есть два способа работы с Service References. Первый – хранить конфигурацию в файле .config, второй – делать все через код.
Использование .config-файла
Для начала я создал консольное приложение на Visual Basic и добавлю два service reference’а (как – уже было разъяснено в других статьях). Затем скопировал секцию ServiceModel из .config-файла к этой заметке, и вставил его (затер) секцию ServiceModel в своем новом .config-файле.
После этого осталось лишь написать код.
Sub Main()
Dim baseURL As String = "http://localhost:7047/DynamicsNAV/WS/"
Во-первых, подлключаемся к веб-сервису System и перечисляем фирмы:
Dim systemService As New SystemServiceRef.SystemService_PortClient(«SystemService_Port», baseURL + «SystemService»)
Dim companies() As String = systemService.Companies()
Console.WriteLine(«Companies:»)
For Each company As String In companies
Console.WriteLine(company)
Next
Dim cur As String = companies(0)
Теперь у меня есть фирма, которую будем использовать в cur, и можно создавать URL к CustomerPage:
Console.WriteLine(vbCrLf + "URL of Customer Page: " + customerPageURL)
Затем я создаю Service Class на Customer Page:
И используя его, читаю данные по клиенту 10000 и вывожу его название:
Console.WriteLine(vbCrLf + "Name of Customer 10000: " + customer10000.Name)
И, наконец, давайте сделаем фильтр и считаем из базы всех английских (GB) клиентов с кодом склада RED или BLUE:
filter1.Field = CustomerPageRef.Customer_Fields.Country_Region_Code
filter1.Criteria = "GB"
Dim filter2 As New CustomerPageRef.Customer_Filter()
filter2.Field = CustomerPageRef.Customer_Fields.Location_Code
filter2.Criteria = "RED|BLUE"
Console.WriteLine(vbCrLf + "Customers in GB served by RED or BLUE warehouse:")
Dim filters() As CustomerPageRef.Customer_Filter = New CustomerPageRef.Customer_Filter(1) {filter1, filter2}
Dim customers() As CustomerPageRef.Customer = customerService.ReadMultiple(filters, Nothing, 0)
For Each customer As CustomerPageRef.Customer In customers
Console.WriteLine(customer.Name)
Next
Console.WriteLine(vbCrLf + "THE END")
Console.ReadLine()
End Sub
End Module
Работа через код Visual Basic
При необходимости избежать использования .config-файла, необходимо применить тот же подход, что описан в
Проделаем это с тем кодом, что мы уже написали выше. Просто удалите app.config и сделайте в коде следующие изменения:
Sub Main()
Dim baseURL As String = "http://localhost:7047/DynamicsNAV/WS/"
Dim navWSBinding As New System.ServiceModel.BasicHttpBinding()
navWSBinding.Security.Mode = ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly
navWSBinding.Security.Transport.ClientCredentialType = ServiceModel.HttpClientCredentialType.Windows
Dim systemService As New SystemServiceRef.SystemService_PortClient(navWSBinding, New System.ServiceModel.EndpointAddress(baseURL + "SystemService"))
systemService.ClientCredentials.Windows.AllowedImpersonationLevel = Security.Principal.TokenImpersonationLevel.Delegation
systemService.ClientCredentials.Windows.AllowNtlm = True
Dim companies() As String = systemService.Companies()
Console.WriteLine("Companies:")
For Each company As String In companies
Console.WriteLine(company)
Next
Dim cur As String = companies(0)
Dim customerPageURL As String = baseURL + Uri.EscapeDataString(cur) + "/Page/Customer"
Console.WriteLine(vbCrLf + "URL of Customer Page: " + customerPageURL)
Dim customerService As New CustomerPageRef.Customer_PortClient(navWSBinding, New System.ServiceModel.EndpointAddress(customerPageURL))
customerService.ClientCredentials.Windows.AllowedImpersonationLevel = Security.Principal.TokenImpersonationLevel.Delegation
customerService.ClientCredentials.Windows.AllowNtlm = True
Dim customer10000 As CustomerPageRef.Customer = customerService.Read("10000")
Console.WriteLine(vbCrLf + "Name of Customer 10000: " + customer10000.Name)
Dim filter1 As New CustomerPageRef.Customer_Filter()
filter1.Field = CustomerPageRef.Customer_Fields.Country_Region_Code
filter1.Criteria = "GB"
Dim filter2 As New CustomerPageRef.Customer_Filter()
filter2.Field = CustomerPageRef.Customer_Fields.Location_Code
filter2.Criteria = "RED|BLUE"
Console.WriteLine(vbCrLf + "Customers in GB served by RED or BLUE warehouse:")
Dim filters() As CustomerPageRef.Customer_Filter = New CustomerPageRef.Customer_Filter(1) {filter1, filter2}
Dim customers() As CustomerPageRef.Customer = customerService.ReadMultiple(filters, Nothing, 0)
For Each customer As CustomerPageRef.Customer In customers
Console.WriteLine(customer.Name)
Next
Console.WriteLine(vbCrLf + "THE END")
Console.ReadLine()
End Sub
End Module
В обоих случаях вы можете изменить пользователя, от имени которого идет подключение к веб-сервисам, с помощью указания service.ClientCredentials.Windows.ClientCredential tна экземпляр System.Net.NetworkCredential. Смотрите пример:
systemService.ClientCredentials.Windows.ClientCredential = New System.Net.NetworkCredential(«user», «password», «domain»)
Надеюсь, что моя заметка поможет вам.
Удачи!
Оригинал заметки доступен здесь:

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.