2012-12-17 367 views
4

我想创建一个可以在我的C#应用​​程序和扩展之间进行通信的桥梁。
下面是我真正想要的解释: 我创建了一个扩展,它将获取HTML元素的详细信息。
但每次启动Chrome时都会启动。而不是这样做,是否有任何方法可以发送消息到我的Chrome扩展以获取HTML元素的详细信息,然后将其发送回C#应用程序?如何使用C#与Chrome(Chrome扩展)进行通信?

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

让我向你解释,我想:

  1. 当我打开我的铬,我的分机将自动启动也是我的background.cs(背景页)将启动。 (在这里,我想一些客户端 - 服务器类型的通信)

  2. 使用我的C#应用​​程序,我将一些数据发送到浏览器扩展程序(如StartFetchingDocument)

  3. 一旦我extention得到这个消息(即StartFetchingDocument)那么我的扩展应该注入contect-sctipt.js到选定的选项卡。

我知道什么,我需要的是数据发送回C#的休息,但在这里我得到了在这一个阶段,只有坚持 - 如何从C#的数据发送到我的分机(背景页)。

回答

8

嗯...有可能是更好的方法,但一个简单的方法可以在你的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(); 

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

+0

setInterval(poll,1000); < - 这不完全是轮询:)轮询是当你发送一个请求,它将不会返回一个响应,直到它是必要的,但问题是好的:) – povilasp

+1

改变它为中性setInterval(getCommand,1000),@povilasp。欢呼声:) – cviejo

+0

你有可能给我发送一些例子吗?请,因为我对此很新。 –

0

如果您在调试模式下启动Chrome并登录RemoteDebugging,然后您可以通过指定的端口连接到它,您可能可以执行此操作,但这有点麻烦。

您可以尝试调查Adobe Brackets如何做,但我有一种感觉,它是相同的方法。

+0

能否请您给我更多有关它的信息,因为我对此很新颖? –

+0

基本上,我给你的链接你会发现如何在特定端口上以调试模式启动chrome。有了这些信息,你就可以打开http:\\ localhost:或一个套接字到你的端口,你将直接链接到chrome。我不确定如何访问扩展程序,但是可以打开页面和类似的东西。更多的信息如何做到这一点,你会发现在Chrome的支持论坛,因为它不是与C#相关的东西# – dutzu

0

大多数谷歌浏览器扩展程序都是用HTML,CSS或Javascript编写的。然后,将您的扩展程序目录绑定到.crx Chrome扩展程序文件与运行短小Python script一样简单。但是,C#可以被翻译成Javascript,你可以为自己的扩展编写自己的业务逻辑。看看Script#

+0

它不是这样的,我想创建一个自动化工具,它可以记录某些HTML事件,如填写表格和播放,I有一切用C#编写的Internet Explorer,但对于Chrome我真的没有任何选择如何做到这一点? –