C# Webkit 不会显示 Html
C# Webkit won't display Html
我已经将 WebKit.Net 中的 WebkitBrowser 包含到我的 C# 项目中,它可以正常工作,除非我想加载一个 Html 字符串 。这是我要显示的Html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />-->
<meta name="viewport" content="width=device-width, initial-scale=2">
<meta name="description" content="">
<meta name="author" content="">
<title>mentor+</title>
<link href="http://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/css/style-ver-1463736306000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/css/landingpage-ver-1463664722000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/font-awesome/css/font-awesome.min-ver-1448702160000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/vis/vis.min-ver-1460038992000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference/webjars/bootstrap/3.3.6/css/bootstrap-ver-1455709722000.css" />
</head>
<body>
<div>
</div>
<div>
<div class="container-fluid">
<div class="bs-example">
<div class="jumbotron">
<div id="mynetwork" ></div>
</div>
</div>
</div>
</div>
<footerbucket><script type="text/javascript" src="./wicket/resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-1.12.0-ver-1457005336000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-event-jquery-ver-1457005336000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/topButton-ver-1462984064000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/jquery-1-12-1-min-ver-1462366394000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/vis/vis.min-ver-1463655366000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/networkgraph-ver-1463047612000.js"></script>
<script type="text/javascript" src="./wicket/resource/de.agilecoders.wicket.core.markup.html.references.JQueryMigrateJavaScriptReference/js/jquery-migrate-1.3.0-ver-1457345416000.js"> </script>
<script type="text/javascript" id="bootstrap-js" src="./wicket/resource/de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference/webjars/bootstrap/3.3.6/js/bootstrap-ver-1455709722000.js"></script>
<script type="text/javascript" >
/*<![CDATA[*/
Wicket.Event.add(window, "load", function(event) {
createNetwork(new vis.DataSet([{"id":0,"label":"Amalie","color":"#FA5858"},{"id":1,"label":"Daniel","color":"#2E64FE","shape":"box"},{"id":2,"label":"Carola","color":"#01DF01","shape":"ellipse"},{"id":3,"label":"Annette","color":"#58FAF4","shape":"ellipse"},{"id":4,"label":"Marius","color":"#58FAF4","shape":"box"}]),new vis.DataSet([{"id":0,"from":0,"to":1,"length":80,"width":6,"color":"#2E64FE"},{"id":1,"from":0,"to":2,"length":40,"width":6,"color":"#01DF01"},{"id":2,"from":0,"to":3,"length":40,"width":6,"color":"#58FAF4"},{"id":3,"from":0,"to":4,"length":40,"width":6,"color":"#58FAF4"}]));
;});
/*]]>*/
</script>
</footerbucket>
</html>
</body>
我将它与服务器地址的 Cefsharp 一起使用,它有效:
ChromiumWebBrowser cef = new ChromiumWebBrowser();
cef.LoadHtml(responseFromServer, server + "home");
如您所见,一个参数是服务器地址。
如果我将 Html-string 导出到文件中并尝试使用任何浏览器加载它,它也不起作用,所以我认为需要提供服务器地址,但我不能找到任何拟合方法。你能帮帮我吗?
编辑:
现在我从服务器编辑了代码,它将与 POST 参数一起工作,并且它在每个浏览器中都工作。 WebKit 除外!
URL 现在看起来像这样:
http://mentorplus.de/networkgenerator/getNetworkgraph?network=[{%22focusPerson%22:%22Amalie%22,%22memberList%22:[{%22role%22:%22MENTOR%22,%22name%22:%22Daniel%22,%22gender%22:%22MALE%22,%22relationship%22:%22FRIENDS%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22TWOHOUR%22},{%22role%22:%22MENTOR%22,%22name%22:%22Carola%22,%22gender%22:%22FEMALE%22,%22relationship%22:%22FAMILY%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22},{%22role%22:%22NETWORKMEMBER%22,%22name%22:%22Annette%22,%22gender%22:%22FEMALE%22,%22relationship%22:%22OTHER%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22},{%22role%22:%22NETWORKMEMBER%22,%22name%22:%22Marius%22,%22gender%22:%22MALE%22,%22relationship%22:%22OTHER%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22}]}]&authenticated=tellur
那么 WebKit 的问题到底是什么?也许是脚本?
编辑 2:
有趣,使用标准 Wpf 浏览器有效。所以我将此帖子标记为已回答,但我仍然对解决方案感兴趣
非常感谢!
不幸的是,没有使用 WebKitBrowser from WebKit.NET 的直接方法。但是,应该可以通过跳过几个循环来加载 HTML 字符串。
在内部,WebKitBrowserCore class 在 DocumentText
属性 的设置方法中调用了 _webView.mainFrame().loadHTMLString(Text, null)
。这证实至少可以在内部进行某种 HTML 加载。但是这个方法是在原生WebKit的WebView中,所以需要修改工程才能获取。
我将创建项目的分支并进行以下更改。
- 向
WebKitBrowserCore
添加一个名为 LoadHTMLString 的新方法,其中包含 HTML 字符串和服务器地址的两个参数。
- 使用参数调用
_webView.mainFrame().loadHTMLString(html, server);
方法。
- 将
LoadHTMLString
方法公开给 WebKitBrowser class 方法与其他方法相同,例如 Navigate 方法(它只是调用核心的 Navigate 方法。
我现在无法对此进行测试,所以我不完全确定 WebView 的内部加载HTMLString 方法是否按预期工作。
编辑: 貌似你也可以在WebKitBrowser中使用GetWebView
方法,像这样直接调用mainFrame().loadHTMLString()
方法(语法可能不正确但你会明白的):
(IWebView)webKitBrowser.GetWebView()).mainFrame().loadHTMLString(html, server);
编辑 2: 我刚刚意识到 WebKit 是一个开源项目,很容易验证 loadHTMLString 是否符合我的想法。这是 WebFrame.h 头文件的摘录:
/*!
@method loadHTMLString:baseURL:
@param string The string to use for the main page of the document.
@param URL The base URL to apply to relative URLs within the document.
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)URL;
*/
HRESULT loadHTMLString([in] BSTR string, [in] BSTR baseURL);
这正是您需要调用的方法,也是 CEFSharp 内部调用的方法。
我已经将 WebKit.Net 中的 WebkitBrowser 包含到我的 C# 项目中,它可以正常工作,除非我想加载一个 Html 字符串 。这是我要显示的Html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />-->
<meta name="viewport" content="width=device-width, initial-scale=2">
<meta name="description" content="">
<meta name="author" content="">
<title>mentor+</title>
<link href="http://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/css/style-ver-1463736306000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/css/landingpage-ver-1463664722000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/font-awesome/css/font-awesome.min-ver-1448702160000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/org.apache.wicket.Application/vis/vis.min-ver-1460038992000.css" />
<link rel="stylesheet" type="text/css" href="./wicket/resource/de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference/webjars/bootstrap/3.3.6/css/bootstrap-ver-1455709722000.css" />
</head>
<body>
<div>
</div>
<div>
<div class="container-fluid">
<div class="bs-example">
<div class="jumbotron">
<div id="mynetwork" ></div>
</div>
</div>
</div>
</div>
<footerbucket><script type="text/javascript" src="./wicket/resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-1.12.0-ver-1457005336000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-event-jquery-ver-1457005336000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/topButton-ver-1462984064000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/jquery-1-12-1-min-ver-1462366394000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/vis/vis.min-ver-1463655366000.js"></script>
<script type="text/javascript" src="./wicket/resource/org.apache.wicket.Application/js/networkgraph-ver-1463047612000.js"></script>
<script type="text/javascript" src="./wicket/resource/de.agilecoders.wicket.core.markup.html.references.JQueryMigrateJavaScriptReference/js/jquery-migrate-1.3.0-ver-1457345416000.js"> </script>
<script type="text/javascript" id="bootstrap-js" src="./wicket/resource/de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference/webjars/bootstrap/3.3.6/js/bootstrap-ver-1455709722000.js"></script>
<script type="text/javascript" >
/*<![CDATA[*/
Wicket.Event.add(window, "load", function(event) {
createNetwork(new vis.DataSet([{"id":0,"label":"Amalie","color":"#FA5858"},{"id":1,"label":"Daniel","color":"#2E64FE","shape":"box"},{"id":2,"label":"Carola","color":"#01DF01","shape":"ellipse"},{"id":3,"label":"Annette","color":"#58FAF4","shape":"ellipse"},{"id":4,"label":"Marius","color":"#58FAF4","shape":"box"}]),new vis.DataSet([{"id":0,"from":0,"to":1,"length":80,"width":6,"color":"#2E64FE"},{"id":1,"from":0,"to":2,"length":40,"width":6,"color":"#01DF01"},{"id":2,"from":0,"to":3,"length":40,"width":6,"color":"#58FAF4"},{"id":3,"from":0,"to":4,"length":40,"width":6,"color":"#58FAF4"}]));
;});
/*]]>*/
</script>
</footerbucket>
</html>
</body>
我将它与服务器地址的 Cefsharp 一起使用,它有效:
ChromiumWebBrowser cef = new ChromiumWebBrowser();
cef.LoadHtml(responseFromServer, server + "home");
如您所见,一个参数是服务器地址。
如果我将 Html-string 导出到文件中并尝试使用任何浏览器加载它,它也不起作用,所以我认为需要提供服务器地址,但我不能找到任何拟合方法。你能帮帮我吗?
编辑:
现在我从服务器编辑了代码,它将与 POST 参数一起工作,并且它在每个浏览器中都工作。 WebKit 除外!
URL 现在看起来像这样:
http://mentorplus.de/networkgenerator/getNetworkgraph?network=[{%22focusPerson%22:%22Amalie%22,%22memberList%22:[{%22role%22:%22MENTOR%22,%22name%22:%22Daniel%22,%22gender%22:%22MALE%22,%22relationship%22:%22FRIENDS%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22TWOHOUR%22},{%22role%22:%22MENTOR%22,%22name%22:%22Carola%22,%22gender%22:%22FEMALE%22,%22relationship%22:%22FAMILY%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22},{%22role%22:%22NETWORKMEMBER%22,%22name%22:%22Annette%22,%22gender%22:%22FEMALE%22,%22relationship%22:%22OTHER%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22},{%22role%22:%22NETWORKMEMBER%22,%22name%22:%22Marius%22,%22gender%22:%22MALE%22,%22relationship%22:%22OTHER%22,%22emotionalRelationship%22:%22NORMAL%22,%22distance%22:%22ONEHOUR%22}]}]&authenticated=tellur
那么 WebKit 的问题到底是什么?也许是脚本?
编辑 2:
有趣,使用标准 Wpf 浏览器有效。所以我将此帖子标记为已回答,但我仍然对解决方案感兴趣
非常感谢!
不幸的是,没有使用 WebKitBrowser from WebKit.NET 的直接方法。但是,应该可以通过跳过几个循环来加载 HTML 字符串。
在内部,WebKitBrowserCore class 在 DocumentText
属性 的设置方法中调用了 _webView.mainFrame().loadHTMLString(Text, null)
。这证实至少可以在内部进行某种 HTML 加载。但是这个方法是在原生WebKit的WebView中,所以需要修改工程才能获取。
我将创建项目的分支并进行以下更改。
- 向
WebKitBrowserCore
添加一个名为 LoadHTMLString 的新方法,其中包含 HTML 字符串和服务器地址的两个参数。 - 使用参数调用
_webView.mainFrame().loadHTMLString(html, server);
方法。 - 将
LoadHTMLString
方法公开给 WebKitBrowser class 方法与其他方法相同,例如 Navigate 方法(它只是调用核心的 Navigate 方法。
我现在无法对此进行测试,所以我不完全确定 WebView 的内部加载HTMLString 方法是否按预期工作。
编辑: 貌似你也可以在WebKitBrowser中使用GetWebView
方法,像这样直接调用mainFrame().loadHTMLString()
方法(语法可能不正确但你会明白的):
(IWebView)webKitBrowser.GetWebView()).mainFrame().loadHTMLString(html, server);
编辑 2: 我刚刚意识到 WebKit 是一个开源项目,很容易验证 loadHTMLString 是否符合我的想法。这是 WebFrame.h 头文件的摘录:
/*!
@method loadHTMLString:baseURL:
@param string The string to use for the main page of the document.
@param URL The base URL to apply to relative URLs within the document.
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)URL;
*/
HRESULT loadHTMLString([in] BSTR string, [in] BSTR baseURL);
这正是您需要调用的方法,也是 CEFSharp 内部调用的方法。