Обработка исключений в скрипте VB.NET SSIS с WebClient (загрузка по FTP) - PullRequest
2 голосов
/ 20 марта 2019

В SSIS Я использую задачу скрипта VB.NET для загрузки файла из папки FTP.

Сценарий следующий

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Net

Public Class ScriptMain
    Public Sub Main()
        Dim objWebClient As WebClient = New WebClient()
        Dim strDownloadURL As String = "ftp://mydownloadhosting.com/myfolder/" + Dts.Variables("GetDate").Value.ToString() + "_daily.xml"
        Dim strFileName As String = Dts.Variables("WorkingFile").Value.ToString()
        Dim wp As WebProxy = New WebProxy("my.proxy.local", 1234)

        objWebClient.Proxy = wp
        objWebClient.Credentials = New System.Net.NetworkCredential("username", "password")
        objWebClient.DownloadFile(strDownloadURL, strFileName)

        Dts.TaskResult = Dts.Results.Success
    End Sub
End Class

это работает правильно, но моя цель - управлять исключением, в частности, чтобы различать:

  • файл не найден
  • все другие проблемы (тайм-аут, проблема с прокси, ...)

Я провел некоторое исследование о том, как управлять исключениями с помощью WebClient(), и обнаружил следующее:

которые они дают различные формы следующего:

try
{
    // try to download file here
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
        {
            // handle the 404 here
        }
    }
    else if (ex.Status == WebExceptionStatus.NameResolutionFailure)
    {
        // handle name resolution failure
    }
}

Основная проблема в том, что мой код находится на VB.NET, а все опубликованные ответы написаны на C #, как можно создать try / catch конструкцию для обработки исключения в моем коде?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Эквивалентный код в VB.NET:

Try
    ' try to download file here
Catch ex As WebException
    If ex.Status = WebExceptionStatus.ProtocolError Then
        If DirectCast(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.NotFound Then
            ' // handle the 404 here
        End If
    ElseIf ex.Status = WebExceptionStatus.NameResolutionFailure Then
        ' handle name resolution failure
    End If
End Try

Хотя приведенный выше / ваш код предназначен для HTTP, а не для FTP.FTP имеет разные коды состояния.

Для FTP используйте:

Некоторые примеры FTP см .:

0 голосов
/ 20 марта 2019

Существует много конвертеров C # в VB.NET, к которым вы можете обратиться, когда вам нужно конвертировать простые коды:

Эквивалентный код VB.NET:

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Net

Public Class ScriptMain
    Public Sub Main()

        Try

            Dim objWebClient As WebClient = New WebClient()
            Dim strDownloadURL As String = "ftp://mydownloadhosting.com/myfolder/" + Dts.Variables("GetDate").Value.ToString() + "_daily.xml"
            Dim strFileName As String = Dts.Variables("WorkingFile").Value.ToString()
            Dim wp As WebProxy = New WebProxy("my.proxy.local", 1234)

            objWebClient.Proxy = wp
            objWebClient.Credentials = New System.Net.NetworkCredential("username", "password")
            objWebClient.DownloadFile(strDownloadURL, strFileName)

            Dts.TaskResult = Dts.Results.Success

        Catch ex As WebException

            If ex.Status = WebExceptionStatus.ProtocolError Then

                If (CType(ex.Response, HttpWebResponse)).StatusCode = HttpStatusCode.NotFound Then

                   'handle the 404 here

                End If
            ElseIf ex.Status = WebExceptionStatus.NameResolutionFailure Then

                'handle name resolution failure

            End If

            Dts.TaskResult = Dts.Results.Failure

        End Try


    End Sub
End Class
...