防外链

博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html

Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 https://bitbucket.org/xilium/xilium.cefglue/wiki/Home

当然它还有很多工作要做,这里介绍一下怎样利用XHR实现Js调用c#方法。代码已经在官方Demo里,只是没有中文资料,英文资料也几乎没有,这里只是把它挖出来讲一下,本人毫无技术含量。ps:感谢热心的@dmitry.azaraev邮件耐心回复。

本文参考自 http://www.wuleba.com/23614.html,感谢@flydoos给我很多启发。

另外园子里也有介绍入门教程:http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html,建议先阅读该系列教程。

什么是XHR

XMLHttpRequest (XHR) is an API available to web browser scripting languages such as JavaScript. It is used to send HTTP or HTTPSrequests to a web server and load the server response data back into the script.[1] Development versions of all major browsers support URI schemes beyond http: and https:, in particular, blob: URLs are supported.[2]

在这里,XHR可以向CefGlue浏览器发送请求,并接收回复,简单的字符串即可通过Post传递,如果是复杂对象,可以使用Json转换后传递。

CefGlue提供的API

RegisterSchemeHandlerFactory(string schemeName, string domainName, CefSchemeHandlerFactory factory)

该方法位于CefRuntime,在启动Initialize后使用。其向浏览器注册一个Scheme处理工厂。

三个参数:

schemeName:scheme名;

domainName:使用域 的名称,这一个参数比较重要,在js中我们需要向这个地址发送Post请求,可以随便填,比如 "testdomain",那么在js中请求的地址是 "http://testdomain/";

factory:处理工厂,需要来装配一个处理handle。

C#端需要做的两项工作

1.新建一个类DumpRequestResourceHandler,继承自CefResourceHandler,有六个函数需要我们继承,这里只用到前面三个。

protected override bool ProcessRequest(CefRequest request, CefCallback callback)
{
//
return true;
} protected override void GetResponseHeaders(CefResponse response, out long responseLength, out string redirectUrl)
{
//
responseLength = -;
redirectUrl = null;
} protected override bool ReadResponse(Stream response, int bytesToRead, out int bytesRead, CefCallback callback)
{
//
bytesRead = ;
return false; } protected override bool CanGetCookie(CefCookie cookie)
{
return false;
} protected override bool CanSetCookie(CefCookie cookie)
{
return false;
} protected override void Cancel()
{
}

2.新建一个类DemoAppSchemeHandlerFactory,继承自CefSchemeHandlerFactory
这个就是我们需要在注册时用到的工厂,继承他的Creat函数,返回我们上面建的DumpRequestResourceHandler实例即可。

        protected override CefResourceHandler Create(CefBrowser browser, CefFrame frame, string schemeName, CefRequest request)
{
return new DumpRequestResourceHandler();
}

Js端需要做的工作
js端需要做的就是创建一个XmlHttpRequest,向之前注册的地址发请求即可,代码在园子里很多,随便搜搜就能找到。

<script type="text/javascript">
function CreateXmlHttpRequest() {
var xmlHttp = null;
if (window.XMLHttpRequest) {
// For Mozilla, Safari, ...
xmlHttp = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
// For Internet Explorer
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlHttp;
}
function testPost() {
var xmlHttp = CreateXmlHttpRequest();
var para = "id=testid&name=testname";
xmlHttp.open("POST", "http://testdomain/", false);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.send(para);
var result = xmlHttp.status;
if (xmlHttp.readyState == ) {
if (result == ) {
var response = xmlHttp.responseText;
alert(response);
}
}
}
</script>

这里的js只是举个栗子,你也可以用异步的请求之类的,不要在意这些细节。

如何接收Post数据

回到DumpRequestResourceHandler 的ProcessRequest方法,post过来的数据就在request.PostData里,GetElements()以后把字节数组转成字符串即可。

怎么返回数据给Js

在DumpRequestResourceHandler的GetResponseHeaders方法里,你需要回复一个接收成功的状态:

response.MimeType = "text/html";
response.Status = ;
response.StatusText = "OK, hello from handler!";

并写一些头信息:

            var headers = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase);
headers.Add("Cache-Control", "private");
headers.Add("Access-Control-Allow-Origin","*");
response.SetHeaderMap(headers);

注意这一句代码:headers.Add("Access-Control-Allow-Origin","*"); 因为跨域的问题,如果你的html在本地,XHR的返回永远都是0并没有数据。这里是允许所有的跨域访问,存在安全问题暂时不表。

你可以在这里找到更多资料:

http://stackoverflow.com/questions/15977151/loading-local-content-through-xhr-in-a-chrome-packaged-app

http://blog.csdn.net/hfahe/article/details/7730944

在ReadResponse方法里把数据写回去:

response.Write(responseData, pos, bytesToRead);

是不是跑题了?一直都没讲怎么调用c#方法啊?你特么是在逗我吗?
......

我是这样做的,在js的post数据里带参数,比如我要调用的c#方法是A类中的test(string msg);

我的post参数这样传:

var para = "method=test&msg=testtext";

ProcessRequest拿到参数以后就知道了函数的名字和参数,将A类中的test方法反射出来执行,如需要返回值,参考上面的方法即可。

这样做存在一些问题,比如函数无法重载、js和c#类型转换之类的。

我这边项目用到的基本公开给js的函数都很明确,没有重载;另外有复杂对象,也能用json来解决。暂时绕开了这些问题,当然也不是很难解决。

官方的代码实例可以在这里找到:

Xilium.CefGlue.Demo.DemoApp  78行,注册scheme

Xilium.CefGlue.Demo的SchemeHandler文件夹下的DemoAppSchemeHandlerFactory、DumpRequestResourceHandler两个类。

如果有不明白的地方,可以慢慢看代码。

感兴趣的,可以加入:WebKit/Blink 内核浏览器开发 QQ交流群:244840771

Xilium.CefGlue利用XHR实现Js调用c#方法的更多相关文章

  1. JS调用Silverlight方法拾遗

    在最近做的物联网项目中,需要利用封装过的Silverlight刻度控件显示温度,湿度,二氧化碳浓度等值.由于最新的数据是通过js ajax获取的,所以需要把这些数据传递给silverlight显示,这 ...

  2. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  3. [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]

    原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...

  4. UIWebView中Html中用JS调用OC方法及OC执行JS代码

    HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...

  5. js调用后台方法(如果你能容忍执行的后台方法变成一个常量)

    最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了.其中用到了一个技术:js调用后台方法.解决这个问题花了不少时间,现如今仍然还有些不明白的地方,今天跟大家分享一下.真正明白的同学欢迎指正 ...

  6. c# js调用AjaxPro方法出错解析

    公司的项目的框架中有一部分用到了AjaxPro这个方法,看到这个方法的我一脸懵逼,老老实实去百度了一下. AjaxPro是.NET平台下的一个回调式AJAX框架,使用简单,功能强大.顾名思义ajax, ...

  7. 在WebBrowser控件使用js调用C#方法

    有时我们需要在WebBrowser控件中嵌入了网页,然后通过html页面调用后台方法,如何实现呢?其实很简单,主要有三步: 在被调用方法所属的类上加上[ComVisible(true)]标签,意思就是 ...

  8. JS调用App方法及App调用JS方法

    做App内嵌H5项目时,经常会遇到js与App的交互,最普遍的就是方法的互相调用,那么如何实现方法的互相调用呢? 写在前面: 如果只是小项目且后期扩大的可能性不大的时候,可以忽略,可如果是长期项目的话 ...

  9. .NET混合开发解决方案11 WebView2加载的网页中JS调用C#方法

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

随机推荐

  1. vmware mac虚拟机 停在启动界面

    前言: 关于vmware安装mac 10.8 可以从参看:http://www.cnblogs.com/zyf2013/p/3888242.html 安装完成以后重新启动,卡在了白苹果启动画面处. 或 ...

  2. C#_dropdownlist_1

    关于ASP.net MVC 中DropDownList绑定与提交数据   在做 ASP.net MVC项目中,数据绑定也是很关键的,现在以个人经验与大家交流下 ASP.net MVC 中DropDow ...

  3. Apache的RewriteRule规则详细介绍

    R[=code](force redirect) 强制外部重定向 (rkyW z强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定, ...

  4. Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法

    最近做项目发现未能加载文件或程序集的错误,这是由于我的机器上没有安装Ajax的原因.问题解决后,整理如下:表现:1."System.Web.Extensions, Version=1.0.61025. ...

  5. javascript数据结构和算法[转]

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符分割,返回字符串数组表示. 这里有个例子: var names = [&qu ...

  6. [转]oracle的ANYDATA数据类型

    本文转自:http://blog.csdn.net/yuzhenhuan01/article/details/6606106 ANYDATA数据类型是个有点奇特的类型,你可以把不同数据类型的数据通过转 ...

  7. FIFO分枝_限界算法

    问题: 检索4-皇后问题的状态空间树如下图的基本过程.(4-皇后问题解空间的树结构,结点按深度优先检索编号)  如果按序扩展这些结点,则下一个E-结点就是结点2.扩展结点2后生成结点3,8和13.利用 ...

  8. ADC及DA的头文件复析

    /************************************************************* ADC12,,,,这么多的定义,搞得我都昏死啦,抽出来可能好几一些..** ...

  9. 到目前为止,Linux下最完整的Samba服务器配置攻略

    关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...

  10. C# 接口的隐式与显示实现【转】

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的 ...