Подключение к веб-сервисам NAV из Visual Basic.NET при помощи Service Reference

В целом, настоящая заметка – это переписанные на языке Visual Basic статьи «Подключение к веб-сервисам NAV из C# при помощи Service Reference (вариант с написанием кода)» и «», объединенные вместе, так что ознакомьтесь с ними перед чтением этой заметки.

Как уже описывалось в других заметках, есть два способа работы с Service References. Первый – хранить конфигурацию в файле .config, второй – делать все через код.

Использование .config-файла

Для начала я создал консольное приложение на Visual Basic и добавлю два service reference’а (как – уже было разъяснено в других статьях). Затем скопировал секцию ServiceModel из .config-файла к этой заметке, и вставил его (затер) секцию ServiceModel в своем новом .config-файле.

После этого осталось лишь написать код.

Module Module1

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:

Dim customerPageURL As String = baseURL + Uri.EscapeDataString(cur) + "/Page/Customer"
Console.WriteLine(vbCrLf + "URL of Customer Page: " + customerPageURL)

Затем я создаю Service Class на Customer Page:

Dim customerService As New CustomerPageRef.Customer_PortClient("Customer_Port", customerPageURL)

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

Dim customer10000 As CustomerPageRef.Customer = customerService.Read("10000")
Console.WriteLine(vbCrLf + "Name of Customer 10000: " + customer10000.Name)

И, наконец, давайте сделаем фильтр и считаем из базы всех английских (GB) клиентов с кодом склада RED или BLUE:

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

Работа через код Visual Basic

При необходимости избежать использования .config-файла, необходимо применить тот же подход, что описан в этой статье, для создания конфигурации из кода.

Проделаем это с тем кодом, что мы уже написали выше. Просто удалите app.config и сделайте в коде следующие изменения:

Module Module1

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»)

Надеюсь, что моя заметка поможет вам.

Удачи!

Оригинал заметки доступен здесь: http://blogs.msdn.com/b/freddyk/archive/2010/01/20/connecting-to-nav-web-services-from-visual-basic-net-using-service-reference.aspx

Автор:

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

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

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