Ways to get data from localhost port using CefSharp

拈花ヽ惹草 提交于 2019-12-13 08:49:59

问题


currently developing a .net C# application which is showing a web browser. But since visual studio web browser is still using ie7 and does not support quite lots of things, I plan to put in the CefSharp which is the Chromium. So, have you guys every try get some json data from a localhost server using CefSharp? I have tried two ways to get it but failed.

For C# in Visual Studio, I fired the Chromium browser like this:

var test = new CefSharp.WinForms.ChromiumWebBrowser(AppDomain.CurrentDomain.BaseDirectory + "html\\index.html")
        {
            Dock = DockStyle.Fill,
        };
        this.Controls.Add(test);

Then for the index.html, it is require to get data from local host port 1000 after it loaded. I have tried two ways for the javascript:

First using XMLHttpRequest:

var xmlhttp = new XMLHttpRequest();
  var url = "http://localhost:1000/api/data1";
  var services;
  xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
          services = jQuery.parseJSON(xmlhttp.responseText);
      }
  }
  xmlhttp.open("GET", url, true);
  xmlhttp.send();

Secondly using jquery's .get():

      $.get("http://localhost:1000/api/data1", function (data) {
      var services = data;
  });

But both ways can't return the data. If I put the index.html into normal browser like Chrome or Firefox, I am able to get the data.

Is it something missing in my coding? Any ideas what's wrong guys?


回答1:


I am using Chromium web browser and making GET request to localhost for JSON. Along with this i am running a webserver which keeps on listening and return JSON.

Webserver:

public class WebServer
{
    public WebServer()
    {
    }
    void Process(object o)
    {
        Thread thread = new Thread(() => new WebServer().Start());
        thread.Start();

        HttpListenerContext context = o as HttpListenerContext;
        HttpListenerResponse response = context.Response;
        try
        {
            string json;
            string url = context.Request.Url.ToString();
            if (url.Contains("http://localhost:8888/json"))
            {
                List<SampleObject> list = new List<SampleObject>();
                json = JsonConvert.SerializeObject(new
                {
                    results = list
                });
                byte[] decryptedbytes = new byte[0];
                decryptedbytes = System.Text.Encoding.UTF8.GetBytes(json);
                response.AddHeader("Content-type", "text/json");
                response.ContentLength64 = decryptedbytes.Length;
                System.IO.Stream output = response.OutputStream;
                try
                {
                    output.Write(decryptedbytes, 0, decryptedbytes.Length);
                    output.Close();
                }
                catch (Exception e)
                {
                    response.StatusCode = 500;
                    response.StatusDescription = "Server Internal Error";
                    response.Close();
                    Console.WriteLine(e.Message);
                }
            }
        }
        catch (Exception ex)
        {
            response.StatusCode = 500;
            response.StatusDescription = "Server Internal Error";
            response.Close();
            Console.WriteLine(ex);
        }
    }
    static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
    public void Start()
    {
        HttpListener server = new HttpListener();
        server.Prefixes.Add("http://localhost:8888/json");
        server.Start();
        while (true)
        {
            ThreadPool.QueueUserWorkItem(Process, server.GetContext());  
        }

    }
}
public class SampleObject
{
    string param1 { get; set; }
    string param2 { get; set; }
    string param3 { get; set; }
}

To Start Webserver:

Thread thread = new Thread(() => new WebServer().Start());
        thread.Start();

Index.html

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
   $.get("http://localhost:8888/json", function (data) {
      var jsonData= data;
  });
});
</script>
</head>
<body>

<p>Example JSON Request.</p>

</body>
</html>

Before launching Index.html inside Chromium web browser, start running webserver to listen for requests. After document load event it makes a ajax call, then it hits the Webserver then Webserver returns JSON. You can test it using Chrome also. Start webserver and type the URL(http://localhost:8888/json) in address bar you will see returned JSON in Developers tools.

Note: Code is not tested. Hope it will work.



来源:https://stackoverflow.com/questions/33489883/ways-to-get-data-from-localhost-port-using-cefsharp

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