从网页发送命令到winform应用程序

时间:2017-03-30 14:54:11

标签: c# .net winforms httplistener httplistenerrequest

我已经使用winform在C#中完成了一个应用程序,现在需要从lighthttp服务器上自托管的网页远程控制(只有一些功能)(作为我的应用程序解决方案中的类包含)

这是服务器代码(对David的BlogEngine而言):

public class WebServer
{
    private readonly HttpListener _listener = new HttpListener();
    private readonly Func<HttpListenerRequest, string> _responderMethod;

    public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method)
    {
        if (!HttpListener.IsSupported)
            throw new NotSupportedException(
                "Needs Windows XP SP2, Server 2003 or later.");

        // URI prefixes are required, for example 
        // "http://localhost:8080/index/".
        if (prefixes == null || prefixes.Length == 0)
            throw new ArgumentException("prefixes");

        // A responder method is required
        if (method == null)
            throw new ArgumentException("method");

        foreach (string s in prefixes)
            _listener.Prefixes.Add(s);

        _responderMethod = method;
        _listener.Start();
    }

    public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes)
        : this(prefixes, method) { }

    public void Run()
    {
        ThreadPool.QueueUserWorkItem((o) =>
        {
            //Console.WriteLine("Webserver running...");
            try
            {
                while (_listener.IsListening)
                {
                    ThreadPool.QueueUserWorkItem((c) =>
                    {
                        var ctx = c as HttpListenerContext;
                        try
                        {
                            string rstr = _responderMethod(ctx.Request);
                            byte[] buf = Encoding.UTF8.GetBytes(rstr);
                            ctx.Response.ContentLength64 = buf.Length;
                            ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                        }
                        catch { } // suppress any exceptions
                        finally
                        {
                            // always close the stream
                            ctx.Response.OutputStream.Close();
                        }
                    }, _listener.GetContext());
                }
            }
            catch { } // suppress any exceptions
        });
    }

    public void Stop()
    {
        _listener.Stop();
        _listener.Close();
    }
}

这是我的winform应用程序中的代码,用于打开它:

    WebServer ws = new WebServer(SendResponse, "http://localhost:8080/test/");
    ws.Run();

这是返回服务器的html:

public static string SendResponse(HttpListenerRequest request)
    {
        return string.Format("<HTML><BODY>My web page.<br>{0}</BODY></HTML>", DateTime.Now);
    }

当我打开&#34; localhost:8080 / test&#34;在我的浏览器上它就像一个魅力,但.. 我不知道如何将信息从网页传递到应用程序以在其上发起事件。

即。如果我按下按钮&#34;关闭&#34;在网页上,它会在winform应用程序上触发关闭事件。

为实现这一目标,我需要实施哪些目标?

(我将逐步更新这篇文章,以及我未来的进展,以使其对每个人都有用)

1 个答案:

答案 0 :(得分:0)

考虑使用Grapevine - 这是为它构建的确切利基。

它允许您在winform应用程序中嵌入一个简单的REST服务器,并轻松地将传入的请求映射到方法。通过发送简单的请求(通过前端的JavaScript或后端的更多C#),您的webapp可以与它们进行交互。

https://sukona.github.io/Grapevine/en/getting-started.html