Jak mogę komunikować się z Chrome (Rozszerzenie Chrome) za pomocą C#?

Chcę stworzyć mostek, który może komunikować się między moją aplikacją C# a rozszerzeniem.
Oto wyjaśnienie tego, czego naprawdę chcę: Stworzyłem rozszerzenie, które pobierze Szczegóły elementu HTML.
Ale zaczyna się za każdym razem, gdy uruchamiam Chrome. Zamiast tego, czy jest jakiś sposób, aby wysłać wiadomość do mojego rozszerzenia chrome, aby uzyskać szczegóły elementu HTML, a następnie wysłać go z powrotem do aplikacji C#?

Jestem w stanie przekazać informacje do C # używając 'XMLHttpRequest' ale problem zaczęło się po załadowaniu mojej strony.

Pozwól, że wyjaśnię ci, czego chcę:

  1. Po otwarciu chrome moje rozszerzenie uruchomi się automatycznie, a także moje tło.rozpocznie się cs (strona tła). (Tutaj chcę jakąś komunikację Klient-Serwer)

  2. Za pomocą mojej aplikacji C# wyślę niektóre dane do rozszerzenia chrome (np. StartFetchingDocument)

  3. Gdy moja rozbudowa otrzyma tę wiadomość (tj. StartFetchingDocument), to moje przedłużenie powinno wstrzyknąć contect-sctipt.js do wybranej zakładki.

Resztę wiem, czego potrzebuję, aby wysłać te dane z powrotem do C#, ale tutaj utknąłem tylko na tym jednym etapie - jak wysłać dane z C# do mojego rozszerzenia (strona tła).

Author: Riot, 2012-12-17

3 answers

Hm...prawdopodobnie są lepsze sposoby, ale łatwym sposobem może być otwarcie HttpListener w aplikacji c# i komunikowanie się z nią z rozszerzenia w następujący sposób:

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

W przykładzie używam jQuery.post, który można dodać do kontekstu rozszerzenia, ale możesz użyć XMLHttpRequest, jeśli podoba Ci się bardziej. A po stronie 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);
        }
    }
}

W funkcji ProcessRequest możesz odczytać dane postu lub wysłać coś z powrotem.

Pobierz dane postu:

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

I wyślij 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();

Tylko szybka burza mózgów, czekam na lepsze pomysły:)

 8
Author: cviejo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 14:08:54

Możesz to zrobić, jeśli uruchomisz chrome w trybie debugowania dla RemoteDebugging, a następnie możesz połączyć się z nim przez określony Port, ale jest to trochę kłopotliwe.

Mógłbyś spróbować zbadać, jak Adobe nawiasy robi to, ale mam wrażenie, że to ta sama metoda.

 0
Author: dutzu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-17 08:52:28

Większość rozszerzeń Google chrome jest napisana w HTML, CSS lub Javascript. Następnie połączenie katalogu rozszerzeń do pliku rozszerzenia Chrome jest tak proste, jak uruchomienie krótkiego Python script. Ale, C# można przetłumaczyć na Javascript, można napisać własną logikę biznesową dla rozszerzeń. Zobacz też Script#

 0
Author: Soner Gönül,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-17 09:01:31