问题描述
我用C#写了一个BHO,在SetSite()中获取IE浏览器的WebBrowser对象,通过其BeforeNavigate2事件截获浏览器提交的请求,将其Cancel掉,修改后再发出,在大部分网站上工作正常,但是访问个别页面内的frame时会抛出UnauthorizedAccessException异常(拒绝访问。异常来自HRESULT:0x80070005E_ACCESSDENIED),百思不解,不知有没有能人能帮忙,谢谢!核心代码(代码里其实未对截获的数据作任何修改,只是原样转发出去,可是就会抛出异常):publicvoidOnBeforeNavigate2(objectpDisp,refobjectURL,refobjectFlags,refobjectTargetFrameName,refobjectPostData,refobjectHeaders,refboolCancel){if(pDispisWebBrowser){Cancel=true;(pDispasWebBrowser).Stop();webBrowser.BeforeNavigate2-=newDWebBrowserEvents2_BeforeNavigate2EventHandler(this.test);objectnullTargetFrameName=null;try{(pDispasWebBrowser).Navigate2(refURL,refFlags,refnullTargetFrameName,refPostData,refHeaders);//用pDisp提交时抛出UnauthorizedAccessException}catch(UnauthorizedAccessExceptionex){Cancel=false;}}//ifpDispisWebBrowser}
如果访问parent.htm,其中有个frame,内容是child.htm,顺序应该是OnBeforeNavigate2先截获访问parent.htm的请求,用Navigate2重发,再截获child.htm,再Navigate2重发,这时就可能抛出异常。举个例子,访问http://bank.ecitic.com/about/,其中有个iframe,就会抛出异常。MSDN上只看到说跨域的时候会抛这个异常,但我这个没有跨域,如果把URL随便改成另一个域的,反倒不抛异常了。。。百思不解,卡了好多天了,求能人帮忙!!
解决方案
解决方案二:
就是跨域访问了
解决方案三:
该回复于2011-11-28 09:22:24被版主删除
解决方案四:
引用1楼sandy945的回复:
就是跨域访问了
还是以http://bank.ecitic.com/about/为例,里面有个iframe:<iframeframeborder="0"scrolling="no"src="../side/banknews.html"height="80"width="100%"allowTransparency="true"></iframe>,这个不应该算跨域吧。而且,如果在代码里截获这个iframe的访问请求,把URL改成http://www.baidu.com之类的地址再提交,反倒不抛异常了。
解决方案五:
该回复于2011-11-28 09:47:39被版主删除
解决方案六:
iframe请求的时候是全路径么?还是直接用的它的src属性请求的
解决方案七:
引用5楼sandy945的回复:
iframe请求的时候是全路径么?还是直接用的它的src属性请求的
是全路径。虽然iframe的src属性是相对路径,但OnBeforeNavigate2中截获的URL已经被浏览器转成绝对路径了,我再重发的时候也沿用的这个URL。
解决方案八:
你单独请求那个iframe的地址有问题么
解决方案九:
引用7楼sandy945的回复:
你单独请求那个iframe的地址有问题么
用一个单独的WebBrowser对象请求当然没问题了,但是要把请求的内容放在frame里。所以用了(pDispasWebBrowser).Navigate2(refURL,refFlags,refnullTargetFrameName,refPostData,refHeaders)的方式,我理解pDisp是这个frame的WebBrowser对象,所以用它来请求,并且把TargetFrameName改成空,放在这个frame自身里,在处理别的frame时都没问题,只某些frame不行。还用过另外一种方法,在SetSite()中获取IE浏览器的顶层WebBrowser对象,用它提交,并且指定TargetFrameName,但运行结果是每个frame都显示在不同的标签页里了。
解决方案十:
自己顶求指点