How Can I communicate with Chrome(Chrome Extension) using C#?

人走茶凉 提交于 2019-12-20 09:25:31

问题


I want to create a bridge which can communicate between my C# application and extension.
Here is the explanation of what I actually want: I have created an extension which will get details of HTML element.
But starts every time I start Chrome. Instead of doing this, is there any way I can send a message to my chrome extension to get HTML element details and then send it back to C# application?

I am able to pass information to C# using 'XMLHttpRequest' but issue is, it got started when my page gets loaded.

Let me explain to you what I want:

  1. When I open my chrome, my extension will start automatically and also my background.cs(background page) will start. (Here I want some client-server kind of communication)

  2. Using my C# application I will send some data to the chrome extension (e.g. StartFetchingDocument)

  3. Once my extention gets this message (i.e. StartFetchingDocument), then my extension should inject contect-sctipt.js to the selected tab.

I know the rest of what I need to send that data back to C#, but here I got stuck only at this one stage - how to send data from C# to my extension (background page).


回答1:


Hm...there's probably better ways, but an easy way might be opening an HttpListener in your c# app and communicate with it from the extension like this:

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

In the example i'm using jQuery.post, which can be added to the extension context, but you could use XMLHttpRequest if you like it better. And on the c# side:

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

In the ProcessRequest function you can read post data or send something back.

Get post data:

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

and send back some stuff with:

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

Just some quick brainstorming, looking forward to better ideas :)




回答2:


You might be able to do this if you start chrome in debug mode for RemoteDebugging and then you can connect to it via the specified Port, but it's a bit of a hassle.

You could try to investigate how Adobe Brackets does it but i have a feeling it's the same method.




回答3:


Most of google chrome extensions are written in HTML, CSS or Javascript. Then, bundling your extension directory into a .crx Chrome Extension file is as simple as running a short Python script. But, C# could be translated into the Javascript, you can write your own business logic for your extensions. Look at Script#



来源:https://stackoverflow.com/questions/13910906/how-can-i-communicate-with-chromechrome-extension-using-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!