【问题标题】:SQL Agent Job running .NET C# WinForms application with a WebBrowser control. Trying to send key strokesSQL 代理作业运行带有 WebBrowser 控件的 .NET C# WinForms 应用程序。尝试发送击键
【发布时间】:2016-09-26 19:24:38
【问题描述】:

正如标题所示,我有一个带有 WebBrowser 控件的 .NET C# Winforms 应用程序。我用它从网站下载(动态生成的)Excel 文件,它工作得很好。我必须按照雇主的要求使用 WebControl。

当我使用 SQL 代理作业运行带有执行进程任务的 SSIS 包来执行应用程序时,它会失败(因为未下载文件)。如果我运行 SSIS 包,它可以正常工作。不同之处在于应用程序窗口未显示的 SQL 作业。

当 WebBrowser 控件显示打开 - 下载 - 关闭对话框时,我发送击键 (Alt + S) 以保存文件,然后关闭对话框。当 SQL 作业运行应用程序时,击键永远不会到达 WebBroser。

我尝试使用 SendKeys.SendWait 发送键,还尝试使用 User32 dll 来获取对话框和按钮句柄,然后使用 SendMessage/PostMessage(两者都尝试过)来发送击键。这两种方法都可以作为 exe 和 SSIS 包正常工作。并且在运行 SQL 作业时这两种方法都失败了。

我也尝试按照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

如果需要,我可以提供应用代码。

任何帮助将不胜感激。请原谅我的英语不好。

问候

【问题讨论】:

    标签: c# winforms webbrowser-control sendkeys sql-agent-job


    【解决方案1】:

    这听起来很傻。为什么必须使用网页控件下载并立即保存网页?由于 SQL 代理作为服务运行,因此尝试使用 Windows 窗体应用程序会让您头疼。

    我会创建一个单独的非交互式控制台应用程序来执行下载和保存,或者如果可重用性是动机 - 将应用程序分成两部分:一个带有 windows 窗体的 exe,另一个带有下载逻辑的 exe。第一个 exe 可以引用另一个 exe 来访问其公共类。

    【讨论】:

    • 这很愚蠢。不幸的是,我不允许在开发机器中使用 Fiddler,并且我被要求使用 WebBrowser 类。我正在尝试实施此解决方案,但我有点卡住了:stackoverflow.com/questions/13362922/…
    猜你喜欢
    • 2012-05-28
    • 2012-08-16
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多