Member 14878480 Ответов: 1

Как выставить счет на SOAP-сервис асинхронно, используя обработчики с помощью VB.NET


Привет,

Я пытаюсь вызвать веб-службы асинхронно из VB.Сетевое настольное приложение. Мой код включен.

При нажатии на кнопку Я вызываю функцию KycCustomerCheck(), которая захватывает необходимые параметры из моей формы и вызывает метод службы асинхронно. После вызова метода я добавляю обработчик событий, который вызывает функцию getCDDresults, которая извлекает результаты метода и записывает их в DataGridView в моей форме.

Когда я тестирую приложение, веб-служба успешно вызывается и выполняется. Однако мой обработчик событий не выполняется. Я предполагаю, что мой обработчик событий не был реализован правильно. Если кто-то может помочь мне решить эту проблему, я буду очень благодарен. Заранее спасибо.

Искренне,

Мэтью Пейсли
matt.paisley57@gmail.com

Что я уже пробовал:

Public Class DueDilligence

    Public handlerAttached As Boolean = False

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button4.Click
        Dim success As Boolean, strSuccess As String
        Dim b As Button = DirectCast(sender, Button)

        Try
            Select Case b.Name
                Case "Button1"
					'**** this logic works 
                Case "Button4"
                    strSuccess = 	
                    If strSuccess = "Success" Then
                        txtSessionId.Text = "Processing Request"
                    End If
            End Select

        Catch ex As Exception
            txtSessionId.Text = "ERROR: " & ex.Message

        End Try

    End Sub

   Private Function KycCustomerCheck() As String
        Dim KYC As New CustomerDueDilligence.CustomerDueDilligenceService()
        Dim BPCredentialName As String = My.Settings.BPCredentialName
        Dim BPResourceName As String = My.Settings.BPResourceName
        Try
            KYC.Url = My.Settings.HostName & My.Settings.PortAssignment & "/ws/CustomerDueDilligence"
            KYC.Credentials = New System.Net.NetworkCredential(My.Settings.uid, My.Settings.pw)
            KYC.CustomerDueDilligenceAsync(txtFirstName.Text, txtLastName.Text,
                                           txtFirstName.Text & " " & txtLastName.Text,
                                           txtStreet.Text, txtCity.Text, txtState.Text, txtZipCode.Text)
            If Not handlerAttached Then
                AddHandler My.WebServices.CustomerDueDilligenceService.CustomerDueDilligenceCompleted,
                                AddressOf Me.getCDDresults
                handlerAttached = True
            End If

            Return "Success"
        Catch ex As Exception
            Return "Exception - " & ex.Message
        End Try
    End Function

    Private Sub getCDDresults(ByVal sender As Object, ByVal results As CustomerDueDilligence.CustomerDueDilligenceCompletedEventArgs)
        Dim row As String() = New String() {"Name", txtFirstName.Text & " " & txtLastName.Text}
        DataGridView1.Rows.Add(row)
        row = New String() {"Street", txtStreet.Text}
        DataGridView1.Rows.Add(row)
        row = New String() {"City", txtCity.Text}
        DataGridView1.Rows.Add(row)
        row = New String() {"State", txtState.Text}
        DataGridView1.Rows.Add(row)
        row = New String() {"Zip", results.Zip}
        DataGridView1.Rows.Add(row)
        row = New String() {"RealAddress", results.RealAddress}
        DataGridView1.Rows.Add(row)
        row = New String() {"CreditScore", results.CreditScore}
        DataGridView1.Rows.Add(row)
        row = New String() {"OFAC", results.OFAC}
        DataGridView1.Rows.Add(row)
        row = New String() {"DPL", results.DPL}
        DataGridView1.Rows.Add(row)
        row = New String() {"EUFSL", results.EUFSL}
        DataGridView1.Rows.Add(row)
        row = New String() {"INTERPOL", results.INTERPOL}
        DataGridView1.Rows.Add(row)
        row = New String() {"Status", results.Status}
        DataGridView1.Rows.Add(row)
    End Sub

End Class

1 Ответов

Рейтинг:
2

Sandeep Mewara

Я не вижу такого звонка, как My.WebServices.XYZService.getXYZAsync() будучи сделанным или прикрепленным обработчиком столба.

Пример находится в VB, но, надеюсь, даст указания идти вперед. Попробуйте выполнить следующие действия:
1. Обратитесь к веб-сервису XYZ
2. Добавьте обработчик событий для события getXYZCompleted:

Private Sub getXYZCompletedHandler(ByVal sender As Object,
    ByVal e As net.xmethods.www.getXYZCompletedEventArgs)

    MsgBox("XYZ: " & e.Result)
End Sub

3. Добавьте поле для отслеживания, если обработчик события был добавлен в событие getXYZCompleted:
Private handlerAttached As Boolean = False

4. Добавьте метод для добавления обработчика событий к событию getXYZCompleted, если это необходимо, и вызова метода getXYZAsync:
Sub CallGetXYZAsync(ByVal zipCode As Integer)
    If Not handlerAttached Then
        AddHandler My.WebServices.
            XYZService.getXYZCompleted,
            AddressOf Me.TS_getXYZCompleted
        handlerAttached = True
    End If
    My.WebServices.XYZService.getXYZAsync(zipCode)
End Sub

Чтобы вызвать веб-метод getXYZ асинхронно, вызовите метод CallGetXYZAsync. Когда веб-метод завершается, его возвращаемое значение передается обработчику событий getXYZCompletedHandler.

Ссылка: Как вызвать веб - службу асинхронно- Visual Basic | Microsoft Docs[^]


Member 14878480

Спасибо Сандипу за Ваш быстрый ответ.

Я прочитал статью, на которую вы ссылались, прежде чем я построил код, который я представил. Если вы посмотрите на него для пункта 2. Я все предусмотрел:

Private Sub getCDDresults(ByVal sender As Object, ByVal results As CustomerDueDilligence.CustomerDueDilligenceCompletedEventargs)

Это мой обработчик, который принимает результаты веб-службы и записывает их в мою форму VB.

по пункту 3. Я добавил глобальную переменную "handlerAttached as Boolean".

для пункта 4 я добавил следующее в свою функцию, которая выполняется после создания экземпляра WS:

Если не handlerAttached то
Добавитьобработчик Мой.Веб-сервисы.CustomerDueDilligenceService.CustomerDueDilligenceCompleted,
Оператор Addressof Меня.getCDDresults
handlerAttached = истина
Конец, Если

Когда я запускаю свой код, веб-службы создаются и запускаются без исключений. Моя проблема заключается в том, что обработчик событий никогда не выполняется.

Есть ли что - то, что мне нужно добавить в конфигурацию проекта? Я не понимаю, что я сделал не так. Если вы сможете взглянуть поближе, это будет очень ценно.

Sandeep Mewara

Шаг 4, в примерах есть дополнительная строка: My.WebServices.XYZService.getXYZAsync(почтовый индекс)
Неужели чего-то не хватает?

Richard Deeming

Вам нужно прикрепить обработчик событий до вызывая полицию CustomerDueDilligenceAsync метод. В противном случае вызов может завершиться до подключения обработчика событий, и событие будет потеряно.