WebBrowser控件打开https站点

旧地址:http://blog.canself.com/webbrowser_https/

背景:

与上一篇博文一样,此文亦是由于开发DropboxAPI中遇到问题衍生出来的。由于需要重定向https类型网站,但自己的https证书是自签名的,总是提示‘网站的安全证书存在问题’。

鉴此,查了些许资料,然而许多方法对我并没有什么卵用,不过以后还是可用用上的,故整理下【当然其中也有一些有效的方法】

首先,自己使用的是WPF中的WebBrowser

1、设置ServicePointmanager的验证回调,然而,这方法只能用于httprequest等托管代码中,webbrowser实现并不适用。代码如下:

1
2
3
4
5
6
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}

2、在1无效的情况下,又有些朋友说要设置ScriptErrorsSuppressed属性为true,然而wpf中的webbrowser并没有此属性,故有以下方法添加相似设置。【注意:此方法应该是正对脚本执行的】

  • 方法一:【 SetSilent方法调用据说要放在webbrowser的Navigated的事件中】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void SetSilent(WebBrowser browser, bool silent)
{
FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
if (fiComWebBrowser == null)
return;
object objComWebBrowser = fiComWebBrowser.GetValue(browser);
if (objComWebBrowser == null)
return;
objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { silent });
}



SetSilent(sender as WebBrowser, true);
  • 方法二:【 SetSilent方法调用据说要放在webbrowser的Navigated的事件中】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        public static void SetSilent(WebBrowser browser, bool silent)
{
if (browser == null)
throw new ArgumentNullException("browser");

// get an IWebBrowser2 from the document
IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");

object webBrowser;
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
if (webBrowser != null)
{
webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
}
}
}


[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IOleServiceProvider
{
[PreserveSig]
int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject);
}




SetSilent(sender as WebBrowser, true);
  • 方法三:
1
2
3
4
5
6
7
8
9
WebBrowser t = sender as WebBrowser;

dynamic activeX = t.GetType().InvokeMember(
"ActiveXInstance",
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
null,
t,
new object[] { });
activeX.Silent = true;

然而wpf设置了好像没啥用,转而使用winform试试,直接就可以设置ScriptErrorsSuppressed,不过问题来了,设置为true之后,不弹窗了,但我想点的是弹窗的‘是(Y)’啊,设置之后直接就相当于选‘否(N)’了。

不过,网上还有人说要用AxWebBrowser,我也就加了个com试试,不同的是其中设置的是Silent属性,效果和winform基本一样。。。

【注:】wpf与winform中的webbrowser还有一点不一样,wpf用的ie版本好像比较高,https证书不对时直接在页面内显示,而winform中ie版本应该比较低,https证书不对时直接弹窗。

下面就是有效的方法啦:

1、用winform中的webbrowser,自动点击‘是’【使用window api】

1
2
3
4
5
6
7
8
9
10
[DllImport("user32.dll")]
public extern static int FindWindow(string lpclassname, string lpwindowname);

[DllImport("user32.dll")]
public extern static void SetForegroundWindow(int handle);


int iHandle = FindWindow(null, "安全警报");
SetForegroundWindow(iHandle);
System.Windows.Forms.SendKeys.SendWait("Y%");

2、最后一种是自己解决遇到的问题的方法:

使用wpf中的webbrowser,在webbrowser的Navigating事件中,判断当前的uri,自动换为非http的uri

1
(sender as WebBrowser).Navigate(http://www.xxx.com);

若有其他解决方案,欢迎联系。


相关问题地址:

如何禁用“安全警报”窗口中Webbrowser控件

Is it possible to use ServicePointManager with Webbrowser control?

WPF WebBrowser control – how to supress script errors?

How to disable “Security Warning” window in Webbrowser control

SSL 支持-使用 .NET Framework 2.0 在您的应用程序中支持证书

在IIS上部署SSL

旧地址:http://blog.canself.com/iis_ssl/

背景:

在处理DropboxAPI开发时,其重定向的URL地址必须是https的【除了localhost】,不得已在自己网站上加了ssl,下面简单介绍下添加自签名证书,毕竟只是临时使用。

1、打开IIS管理器

2、切换至下图所示页面,选中‘服务器证书’,双击进入

3、鉴于自己临时使用,选择右侧‘创建自签名证书…’打开如下界面:

4、填写完成点击确定即可在证书列表中看到当前添加的证书。

5、选择需要使用证书的网站,进入如下界面,点击右侧‘绑定’,然后添加,类型选择https,填写对应主机名,ssl证书选择刚刚添加的证书,点击确定即可。

6、添加完成后,在对应网站的ssl设置中设置启动SSL,如下图:

7、完成后,即可使用https方式访问自己的网站啦,不过由于使用自签名证书,不受浏览器信任,会出现如下界面,点击继续浏览即可。

WordPress搭建——Window Live Writer离线发布问题

旧地址:http://blog.canself.com/wordpress_wlw/

首次利用WLW发布时,遇到500问题了。【本人使用Windows Server 2012】

1、问题如下:

服务器报告以下网址出错:

http://blog.canself.com/xmlrpc.php

500 Internal Server Error

【注:以下插件(步骤2)不建议装,因为偶装了在卸载之后,就说偶的xmlrpc是禁用的,但跳过此步骤,直接跳至3的话,不会说xmlrpc禁用——在之前的那次偶就这样过来的。。。不过偶傻傻的回滚磁盘了,重新找了问题,还木有找到原因。。。】

2、经查找,说直接到设置—撰写里打开xmlrpc就行了,但就是木有找到这个选项,后来就选择装插件“Control XML-RPC publishing”,这样就可以打开xmlrpc啦,但仍然会报告上述错误,唯一的不同是,之前wlw发布不到博客上,现在是已经发上去了之后继续报500问题。哎。。。

3、无奈之下,只能选择最后一招了,利用IIS中的Web平台安装程序,选择安装php。【这招还是之前处理看到Web平台安装可以直接安装php,不用自己配,觉得新鲜装的,然后,wlw就不报500了】【所以呢——上面500问题很有可能是php配置问题,偶木有找到,希望有人能找到啦】

4、装完继续用wlw就会出现以下问题:【Invalid Response document】

从日志服务器接收的对 metaWeblog.editPost 方法的响应无效:

Invalid response document returned from XmlRpc server

注:其中“metaWeblog.editPost ”问题不定,我第一次遇到的是“blogger.getUsersBlogs”方法相应无效

然后此处问题解决方法就要方便的多

修改wp-includes目录下的class-IXR.php文件,

在以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function output($xml)
{
$charset = function_exists('get_option') ? get_option('blog_charset') : '';
if ($charset)
$xml = '<?xml version="1.0" encoding="'.$charset.'"?>'."\n".$xml;
else
$xml = '<?xml version="1.0"?>'."\n".$xml;
$length = strlen($xml);
header('Connection: close');
header('Content-Length: '.$length);
if ($charset)
header('Content-Type: text/xml; charset='.$charset);
else
header('Content-Type: text/xml');
header('Date: '.date('r'));
echo $xml;
exit;
}

1
2
3
4
5
6
// 将
$length = strlen($xml);

// 改为
$length = strlen($xml)+3;

这个据说是因为wordpress的编码(utf-8)与wlw的编码(utf-8+)不一样导致的。

WordPress博客搭建——PHP安装+IIS处理

旧地址:http://blog.canself.com/wordpress_Environment/

第一次自己搞服务器,安装php,还是有点迷茫的。

首先是下载php,打开下载网站 http://windows.php.net/download。

看到如此多的版本,瞬间凌乱了,就此上网查了查windows server上用啥版本,最后确定用非线程安全的版本。自己买的服务器是64为的,下了个64位非安全版。

接下来,就上网找了下php+iis配置,照样来

1、先将下载的压缩包解压到C:\php目录,一开始傻傻的以为只能这样弄,后来感觉这样只能这样就太弱智了,就试了下,随便解压到那个路径都可以【不要傻傻的弄到系统相关的文件夹下哦】,现在的路径就是D:\..\php啦,又觉得世界多彩啦。

2、修改配置文件

将php.ini-development改名为php.ini,然后就各种模块修改啦

当时查到的主要有:

1
2
3
4
5
6
7
8
9
data.timezone=”Asia/Shanghai”

extension=php_gd2.dll

extension=php_mbstring.dll

extension=php_mysql.dll

extension=php_pdo_mysql.dll

另外就是将extension_dir=改为 extension_dir= “D:\..\php\ext\”

这样php就算搞定啦,另外的扩展,有待慢慢研究,毕竟木有学过php。。。。

3、接下来就是安装CGI,安装完添加模块映射,在iis中处理程序映射——添加模块映射

PDF解析记录——Pdfbox

旧地址:http://blog.canself.com/pdfbox/

此文仅作记录【嫌放电脑里碍事-_-😀】,内容为以前收集的一小段代码。

下面为pdf获取文本的简要代码片段:

1
2
3
4
5
6
private string GetPDFText(string filename)
{
PDDocument pdf = PDDocument.load(filename);
PDFTextStripper pdftext = new PDFTextStripper();
return pdftext.getText(pdf);
}

其中对于旧版本,如pdfbox0.7.3版本,对于一些pdf解析会有问题,例如提示“Unknown encoding for ‘UniGB-UC32-H’”。而将dll换成新的如pdfbox-1.8.2。就可避免此问题【此处本人是通过nuget添加的引用-Pdfbox.1.1.1】。

至于想要其他新版本,可以自己通过pdfbox官网步骤自行生成

教程地址:http://pdfbox.apache.org/building.html


此技术后期很可能不会继续深究(用到再说吧),仅作技术学习路上的留下的一点痕迹。🐌