如何使用C#与Chrome(Chrome扩展)进行通信



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

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

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

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

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

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

我知道将数据发送回C#所需的其余内容,但在这里我只停留在这一阶段——如何将数据从C#发送到我的扩展(后台页面)。

嗯。。。可能有更好的方法,但一个简单的方法可能是在你的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函数中,您可以读取post数据或发回一些内容。

获取帖子数据:

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();

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

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

你可以试着研究Adobe Brackets是如何做到这一点的,但我觉得这是同样的方法。

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

相关内容

  • 没有找到相关文章

最新更新