稀有哦资源供求网

 找回密码
 立即注册
回复: 8

[已解决] 紧急求助!!!

[复制链接]

铁血男儿007

1

主题

4

帖子

6

稀币

注册会员

Rank: 1

积分
6
我这边的业务需求是要通过调用 WebService 来远程启动服务器上的 Winform 程序。

我首先写了一个 Winform 程序,接着又写了一个 WebService 程序,在这个 WebService 程序里面通过命令行的方式,启动那个 Winform 程序,写好以后,在 Visual Studio 开发环境下,调试运行都没有问题,Winform 程序可以被正常启动,然后部署到IIS上就报错了,错误信息如下:

当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。
   在 System.Windows.Forms.Form.Show(IWin32Window owner)
   在 CCWin.CCSkinMain.Fidq2DTrRbjaq7x2UmS(Object , Object )
   在 CCWin.CCSkinMain.OnVisibleChanged(EventArgs e)
   在 System.Windows.Forms.Control.SetVisibleCore(Boolean value)
   在 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
   在 System.Windows.Forms.Control.set_Visible(Boolean value)
   在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   在 System.Windows.Forms.Application.Run(Form mainForm)
   
Program.cs 文件中的“Application.Run(new FrmMain());”这行代码报错,导致 Winform 程序启动不了,无法实现业务需求,请教大家问题究竟出在哪里,应该如何解决?

补充说明:Program.cs 文件中没有 MessageBox.Show() 之类的代码
回复

使用道具 举报

---------------------------------------------------------------------------------------
Tips:
1、当前版块参与回复竞价排序时,如需增加竞拍金额,可通过编辑进行增量补差价,无需再次全额竞拍.
2、当前版块主题帖免费提问,但标题或内容中,禁止宣传信息.解决方案仅可在回复中提供.如需直接发布广告,请到[广告信息发布区].
3、发布信息中涉嫌恶意,诈骗等不正规网址或信息,可能使访问者造成损失的,将被封号.
4、使用各种方式发布恶意信息,或冒充管理人员的,将被封号.网站管理组成员名单请 点此查看 ,网站唯一联系邮箱为xiyouo@vip.qq.com.
---------------------------------------------------------------------------------------


变频器

0

主题

5

帖子

6

稀币

注册会员

Rank: 1

积分
6
发布在IIS中的服务包括窗体界面,去掉窗体相关的操作应该就行,IIS上最好不要运行需要人工交互的内容

除了你说的MessageBox.Show(),还有没有其他与窗体相关的?

IIS应该不跑winform程序,winform程序是桌面应用程序。改成其他,比如控制台应用?

程序中是不能出现窗体的相关代码,比如MessageBox、OpenFileDialog等相关代码。从这个角度出发,可以解决问题。
回复

使用道具 举报


andy_wanhl

0

主题

1

帖子

0

稀币

注册会员

Rank: 1

积分
0
试试给你的winform创建个快捷方式,然后webservice去打开这个快捷方式。
回复

使用道具 举报


铁血男儿007

1

主题

4

帖子

6

稀币

注册会员

Rank: 1

积分
6
 楼主| | 显示全部楼层
我再补充说明几句:


Winform 程序是用来做实时监控的,需要有界面来显示监控结果,所以不能改成Windows服务

这个项目是公司内部项目,服务器放在公司内部机房,只能通过内网来访问,外网访问不了,所以实际访问量不会很大


Winform 程序放在服务器的D盘

WebService 部署在IIS上,程序也放在服务器的D盘,和 Winform 程序是不同的文件夹

在 Visual Studio 中,Winform 程序和 WebService 程序是同一个解决方案下的两个不同的项目,在VS环境下运行都是好的,可以通过调用 WebService 来启动 Winform 程序,部署到IIS上就不行了,exe程序起不来


查看系统日志,错误信息如下:

当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。


为了避免 MessageBox、OpenFileDialog 之类的问题,我曾经尝试建过一个全新的Winform项目,里面只有一个空窗体,然后部署到IIS上,还是不行

总之,在VS环境下都可以顺利启动,部署到IIS上就不行


系统日志显示,

在VS环境下运行,SystemInformation.UserInteractive的值为True,

部署到IIS上运行,SystemInformation.UserInteractive的值为False

但 SystemInformation.UserInteractive 是只读的,改不了


现在问题已经清楚了,但不知道该如何解决?
回复

使用道具 举报


变频器

0

主题

5

帖子

6

稀币

注册会员

Rank: 1

积分
6
在Windows XP、Windows Server 2003 或早期Windows 系统时代,当第一个用户登录系统后服务和应用程序是在同一个Session 中运行的。从Vista 开始Session 0 中只包含系统服务,其他应用程序则通过分离的Session 运行。
所以如果运行环境是Vista或者更新,直接使用系统服务来监测form程序不可行。
对于简单的交互,服务可以通过WTSSendMessage 函数,在用户Session 上显示消息窗口。对于一些复杂的UI 交互,必须调用CreateProcessAsUser 或其他方法(WCF、.NET远程处理等)进行跨Session 通信,在桌面用户上创建一个应用程序界面。
具体的可以搜“穿透Session0隔离”。
比较简单的方法:
1.使用服务监测服务,也就是13楼所述,lz把自己的工作进程改造成系统服务。
2.设置指定用户自动登录,使用form进程来管理自己的form程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

      

关于我们|联系我们|稀有哦资源供求网 | 网站统计

GMT+8, 2024-5-22 01:16

Origins Since 1919 © Singapore Yongxin Association , Inc. or its affiliates

快速回复 返回顶部 返回列表