【问题标题】:System.Windows.Form shows up when app run in visual studio (IIS Express) but not when deployed to IIS ManagerSystem.Windows.Form 在应用程序在 Visual Studio (IIS Express) 中运行时显示,但在部署到 IIS 管理器时不显示
【发布时间】:2017-03-10 22:54:44
【问题描述】:

项目背景简介...我正在运行一个网络应用程序,它允许用户控制和读取连接到服务器机器(在我的例子中是英特尔 NUC)的设备中的数据。

我的问题是我试图检测在后台线程中运行的 System.Windows.Form 内的全局鼠标事件。

    private static Thread serviceThread;

    private IKeyboardMouseEvents mouseEvents;

    private int currentPixel = 0;
    private List<byte> rgb = new List<byte> { 255, 0, 0 };

    public static void StartService()
    {
        serviceThread?.Abort();
        serviceThread = new Thread(() =>
        {
            Application.Run(new TiltWheelService());
        });

        serviceThread.Start();
    }

    public TiltWheelService()
    {
        mouseEvents = Hook.GlobalEvents();
        mouseEvents.MouseDown += OnMouseDown;
        mouseEvents.MouseWheel += OnMouseScrollWheel;
    }

现在,当我通过 IIS Express 通过 Visual Studio 2017(在调试或发布中)运行应用程序时,它会启动我的应用程序,启动 Chrome 实例,并成功创建一个 Windows 窗体,我能够监听任何鼠标事件(在本例中为鼠标向下和滚动)并用它做我想做的事。

但是,当我将其发布到本地运行的 IIS 管理器时,Windows 窗体永远不会出现,并且我无法监听鼠标事件。

任何建议都会有所帮助!

【问题讨论】:

    标签: c# asp.net winforms iis


    【解决方案1】:

    我认为这是不可能的。在 Visual Studio 中以 iisexpress 运行您的网站时,它会在 普通应用程序 作为托管环境中运行。一个普通的应用程序可以随时显示窗口,所以没有问题。

    与此相反,iis(以及因此的asp.net 工作进程)作为服务运行。服务应该在后台运行,无需任何用户交互。此外,为了维护服务器的安全,工作进程在受限用户帐户下运行。

    最后,在默认设置下,工作进程在第一个 http 请求进入时启动,并在一段时间后停止。同时,您的所有鼠标移动都将丢失,因为您的 Web 应用程序根本没有运行。

    我建议您尝试其他解决方案,可能是:

    • 您可以通过winforms 程序获取鼠标坐标,并将它们传达到网络服务器(例如使用命名管道)
    • 您使用某种api 而非鼠标坐标访问外部设备
    • 你不使用网络服务器来完成这项工作,结合你的 winforms 应用程序使用一些远程终端解决方案

    需要阅读的一些额外资源(可能还有更多):

    【讨论】:

    • 感谢@ventiseis 的建议!我最终运行了一个单独的程序来捕获数据并将其传输到托管在 IIS 中的 Web 应用程序。真的像一个魅力,我应该如何开始这个项目,哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多