6

我想创建一个可以在我的 C# 应用程序和扩展之间进行通信的桥梁。
这是我真正想要的解释:我创建了一个扩展,它将获取 HTML 元素的详细信息。
但是每次我启动 Chrome 时都会启动。除了这样做,有什么方法可以向我的 chrome 扩展发送消息以获取 HTML 元素详细信息,然后将其发送回 C# 应用程序?

我可以使用“XMLHttpRequest”将信息传递给 C#,但问题是,它是在我的页面加载时开始的。

让我向你解释我想要什么:

  1. 当我打开我的 chrome 时,我的扩展程序将自动启动,并且我的 background.cs(背景页面)也将启动。(这里我想要一些客户端-服务器类型的通信)

  2. 使用我的 C# 应用程序,我会将一些数据发送到 chrome 扩展(例如 StartFetchingDocument)

  3. 一旦我的扩展收到此消息(即 StartFetchingDocument),那么我的扩展应该将 contect-sctipt.js 注入所选选项卡。

我知道将数据发送回 C# 所需的其余部分,但在这里我只停留在这一阶段 - 如何将数据从 C# 发送到我的扩展程序(背景页面)。

4

3 回答 3

11

嗯...可能有更好的方法,但一种简单的方法可能是在您的 c# 应用程序中打开一个HttpListener并从扩展程序中与它进行通信,如下所示:

var listener = "http://localhost:60024/";

function getCommand(){

    var postData = { 
        "action": "getCommand" 
    };

    $.post( listener, postData, function(response){
        //Parse response and do whatever c# wants
    });
}

function send(data){

    var postData = {
        "action" : "send",
        "data": data
    };

    $.post(listener, postData);
}


setInterval(getCommand, 1000);

在示例中,我使用了 jQuery.post,它可以添加到扩展上下文中,但如果您更喜欢它,可以使用 XMLHttpRequest。在 c# 方面:

using System;
using System.Net;


namespace HttpListenerTEst
{
    class Program
    {
        private static HttpListener _listener;

        static void Main(string[] args)
        {
            _listener = new HttpListener();
            _listener.Prefixes.Add("http://localhost:60024/");
            _listener.Start();
            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);

            Console.ReadLine();
        }

        static void ProcessRequest(IAsyncResult result)
        {
            HttpListenerContext context = _listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;

            //Answer getCommand/get post data/do whatever

            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);
        }
    }
}

在 ProcessRequest 函数中,您可以读取发布数据或发回某些内容。

获取帖子数据:

        string postData;
        using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            postData = reader.ReadToEnd();
            //use your favourite json parser here
        }

并通过以下方式发回一些东西:

        string responseString           = "This could be json to be parsed by the extension";

        HttpListenerResponse response   = context.Response;
        response.ContentType            = "text/html";

        byte[] buffer                   = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64        = buffer.Length;
        Stream output                   = response.OutputStream;

        output.Write(buffer, 0, buffer.Length);
        output.Close();

只是一些快速的头脑风暴,期待更好的想法:)

于 2012-12-19T13:29:42.463 回答
0

如果您在远程调试的调试模式下启动chrome ,然后您可以通过指定的端口连接到它,您也许可以做到这一点,但这有点麻烦。

您可以尝试研究 Adob​​e Brackets 是如何做到的,但我觉得这是相同的方法。

于 2012-12-17T08:52:28.357 回答
0

大多数谷歌浏览器扩展都是用 HTML、CSS 或 Javascript 编写的。然后,将您的扩展目录捆绑到.crxChrome 扩展文件中就像运行一个简短的Python script. 但是,C# 可以翻译成 Javascript,您可以为扩展编写自己的业务逻辑。看着Script#

于 2012-12-17T09:01:31.793 回答