Компонент сценария WATIN on SSIS - однопотоковая квартира - PullRequest
2 голосов
/ 31 марта 2011

Привет! Мне нужно скачать файл с сайта с проверкой подлинности с помощью форм и дальнейшей обработкой текстового файла с помощью служб Integration Services.

Для загрузки файла я выбрал использование WATIN, поэтому я импортировал библиотеку Watin и создал сценарии для браузера. Однако, когда я пытаюсь запустить код, я получаю исключение с этим сообщением.

CurrentThread должен иметь его ApartmentState установлен в ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer.

все это с помощью (с атрибутом метода)

Если я попытаюсь использовать эту строку кода, чтобы установить ее на STA

System.Threading.Thread.CurrentThread.SetApartmentState(Threading.ApartmentState.STA)

Я получаю это исключение

Ошибка: System.Reflection.TargetInvocationException: Исключение было брошено цель вызова. ---> System.InvalidOperationException: Не удалось установить указанный COM квартира гос. в System.Threading.Thread.SetApartmentState (ApartmentState состояние)

Как изменить задачу сценария SSIS для использования этой однопоточной квартиры?

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Я решил эту проблему, создав другой поток с помощью STA ApartmentState.

Код был такой:

Private threadDelegate As ParameterizedThreadStart
Private filesdir As String

<STAThread()> _
Public Sub Main()
    Try
        threadDelegate = New ParameterizedThreadStart(AddressOf Me.DoSomething)
        StartBrowserRoutine(threadDelegate)
        Dts.TaskResult = ScriptResults.Success
    Catch
        Dts.TaskResult = ScriptResults.Failure
    End Try
End Sub

Private Sub StartBrowserRoutine(ByVal threadRoutine As ParameterizedThreadStart)
    Dim dialogThread As Thread = New Thread(threadRoutine)
    dialogThread.TrySetApartmentState(ApartmentState.STA)
    dialogThread.Start(Nothing)
    dialogThread.Join(System.Threading.Timeout.Infinite)
End Sub

Private Sub DoSomething()
    'Do Something
End Sub

Надеюсь, это поможет кому-то с такой же проблемой.

1 голос
/ 30 июля 2015

Мне показалось, что ваше решение очень полезно для моего случая, я добавляю код C #, который использовал, если кому-то это нужно

public void Main() {
    Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join(); // wait for thread to end

    Dts.TaskResult = (int)ScriptResults.Success;
}

public void DoMethod(object sender) {
    System.Windows.Forms.Application.Run(new BrowserWindow("http://x.xxx"));
}

А вот и BrowserWindow класс

class BrowserWindow : Form
{
    private string url;

    public BrowserWindow(string url) {
        this.url = url;
        ShowInTaskbar = false;
        WindowState = FormWindowState.Minimized;
        Load += new EventHandler(Window_Load);
    }

    void Window_Load(object sender, EventArgs e) {
        WebBrowser wb = new WebBrowser();
        wb.AllowNavigation = true;
        wb.DocumentCompleted += wb_DocumentCompleted;
        wb.Navigate(this.url);
    }

    void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser web = sender as WebBrowser;
        // here goes the business logic
    }
}
...