从asp.net向正在运行的Windows应用程序发送数据

本文关键字:应用程序 Windows 数据 运行 net asp | 更新日期: 2023-09-27 18:06:04

我正试图从我的asp.net网页发送数据到一个用c#编写的运行的windows窗体应用程序。当我从网页调用应用程序时,应用程序没有启动的问题,但如果我试图从命令行运行它。

这是在asp.net中启动应用程序的代码部分

protected void Page_Load(object sender, EventArgs e)
{
   // ClientScript.RegisterStartupScript(GetType(), "Javascript", "javascript:connectSocketServer(); ", true);
    SecureString sc = new SecureString();
    string Source = "*****";
    foreach (char c in Source.ToCharArray())
    {
        sc.AppendChar(c);
    }
    ProcessStartInfo i = new ProcessStartInfo(@"C:'******'myapp.exe", "test");
    i.UserName = "******";
    i.UseShellExecute = false;
    i.Password = sc;
    i.Verb = "runas";
    Process p = new Process();
    p.StartInfo = i;
    p.Start();    
}

这是我的应用程序

中的代码
static System.Threading.Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
[STAThread]
static void Main(params string[] Arguments)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form1 mf = new Form1();
    if (mutex.WaitOne(TimeSpan.Zero, true))
    {
        Application.Run(mf);
        mutex.ReleaseMutex();
    }
    else
    {
        MessageBox.Show("only one instance at a time");
        mf.SendData(Arguments);
    }
}

,在表单中有一个名为SendData的公共函数,它将处理Data…

所以如果我从cmd行运行它并传递参数,SendData将被执行,但从网页不工作…

注意:我删除了用户名和密码信息,应用程序在IWAP用户下出现在任务管理器上,但表单不显示

从asp.net向正在运行的Windows应用程序发送数据

您的进程正在启动,但它停止响应,因为它在asp.net工作进程的上下文中运行的权限受到限制。您的新进程没有权限访问此上下文之外的任何内容。

您可以提升工作进程的权限,或者允许IIS服务与桌面交互,如另一个答案所解释的。

然而,在评论中你提到你的Windows应用程序是作为连接客户端的服务器。除非只是为了测试目的,否则我建议使用不同的方法来处理这些客户端套接字,即通过API或Web服务。带有。net远程服务的Windows服务更好,但我建议只使用WCF。

已测试。希望这将解决您的问题。使用Try Catch块

是一个很好的做法
protected void Page_Load(object sender, EventArgs e)
    {
            SecureString sc = new SecureString();
            string Source = "*****";
            foreach (char c in Source.ToCharArray())
            {
                sc.AppendChar(c);
            }
            sc.MakeReadOnly();
            try
            {
                ProcessStartInfo i = new ProcessStartInfo(@"C:'******'myapp.exe", "test");
                i.Domain = "*****";
                i.UserName = "*****";
                i.UseShellExecute = false;
                i.CreateNoWindow = true;
                i.RedirectStandardOutput = true;
                i.Password = sc;
                i.Verb = "runas";
                Process p = new Process();
                p = Process.Start(i);
            }
            catch (Win32Exception w32E)
            {
               // Display Some Message
            }
}