2016-09-26 1 views
1

Как видно из названия, у меня есть приложение .NET C# Winforms с элементом управления WebBrowser. Я использую его для загрузки (динамически сгенерированного) файла Excel с веб-сайта, и он работает нормально. Я должен использовать WebControl в соответствии с просьбой моего работодателя.Работа с SQL-агентом выполняется с использованием приложения .NET C# WinForms с элементом управления WebBrowser. Попытка отправить ключевые штрихи

Когда я использую задание агента SQL для запуска пакета SSIS с выполнением задачи выполнения для выполнения приложения, он не работает (как в файле не загружен). Если я запустил пакет SSIS, он работает правильно. Разница заключается в том, что SQL Job не отображается в окне приложения.

Когда элемент управления WebBrowser показывает диалог Open-Download-Close, я посылаю нажатия клавиш (Alt + S) для сохранения файла и закрытия диалогового окна. Когда SQL Job запускает приложение, нажатия клавиш никогда не попадают в WebBroser.

Я попытался отправить ключи с помощью SendKeys.SendWait, а также с помощью User32 dll, чтобы получить диалоги и кнопки, а затем SendMessage/PostMessage (попробовал оба), чтобы отправить штрихи клавиш. Оба метода корректно работают как exe и как пакет SSIS. И оба метода не работают при выполнении SQL Job.

Я также попытался переопределить диспетчер загрузки, как предложено here, без успеха. Честно говоря, я не знаю, что делать, чтобы получить динамически созданный файл Excel, который приложение должно загружать, когда выполнение достигает переопределенного метода загрузки. Ссылка, которую я получаю при отладке метода Download, не является ссылкой на файл.

/// <summary> 
/// Return S_OK (0) so that IE will stop to download the file itself. 
/// Else the default download user interface is used. 
/// </summary> 
public int Download(IMoniker pmk, IBindCtx pbc, uint dwBindVerb, int grfBINDF, IntPtr pBindInfo, 
        string pszHeaders, string pszRedir, uint uiCP) 
{ 
    // Get the display name of the pointer to an IMoniker interface that specifies the object to be downloaded. 
    string name; 
    pmk.GetDisplayName(pbc, null, out name); 
    if (!string.IsNullOrEmpty(name)) 
    { 
     Uri url; 
     if (Uri.TryCreate(name, UriKind.Absolute, out url)) 
     { 
      if (FileDownloading != null) 
      { 
       FileDownloading(this, new FileDownloadEventArgs(url)); 
      } 
      return Constants.S_OK; 
     } 
    } 
    return 1; 
} 

Это заголовок ответа, когда я нажимаю кнопку, чтобы загрузить файл:

Content-Disposition: attachment; filename="file.xlsx" 

Content-Transfer-Encoding: binary 

Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

Я могу предоставить с кодом приложения, если требуется.

Любая помощь была бы действительно оценена. Извините мой плохой английский.

С уважением

ответ

0

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

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

+0

Это глупо. К сожалению, мне не разрешено использовать Fiddler в dev-машине, и мне было предложено использовать класс WebBrowser. Я пытаюсь реализовать это решение, но я как бы застрял: http://stackoverflow.com/questions/13362922/windows-forms-webbrowswer-control-with-idownloadmanager – 1Tester

Смежные вопросы