C# IE9把我的申请搞砸了

C# IE9把我的申请搞砸了,c#,browser,internet-explorer-9,C#,Browser,Internet Explorer 9,我有一个用C语言编写的网页抓取应用程序,它使用了WebBrowser 它的一个特性是,它允许用户编写一个javascript函数,该函数将在网页中被注入和调用。这是一个用户自制的函数,它接收一个C#对象作为参数,该对象除其他外,还包含一个名为UserData的属性,用户可以使用该属性存储他想要的任何内容,即使在浏览器导航到另一个页面后,它也会留在那里。它还包含一个Browser对象,我将在这里使用它作为示例 如果我在安装IE8时注入并调用以下函数: function ToBeInjected(G

我有一个用C语言编写的网页抓取应用程序,它使用了
WebBrowser

它的一个特性是,它允许用户编写一个javascript函数,该函数将在网页中被注入和调用。这是一个用户自制的函数,它接收一个C#对象作为参数,该对象除其他外,还包含一个名为
UserData
的属性,用户可以使用该属性存储他想要的任何内容,即使在浏览器导航到另一个页面后,它也会留在那里。它还包含一个
Browser
对象,我将在这里使用它作为示例

如果我在安装IE8时注入并调用以下函数:

function ToBeInjected(Global)
{
    function Data()
    {
        this.csObject = Global.Browser;
        this.jsObject = "hi";
    }

    Global.UserData = new Data();
}
然后导航到另一个页面并注入并调用此函数:

function ToBeInjected(Global)
{
    alert(Global.UserData.jsObject);    // works ok on IE8 and IE9 (shows "hi")
    alert(Global.UserData.csObject);    // works on IE8 (show the object's type) but not IE9 ("Permission Denied" error)
}
第二个
警报
将正常工作,并向我显示
浏览器
对象的类型(在此传递给上一个函数的
全局
对象是同一个对象)

我知道在浏览器导航后对象的存在看起来很奇怪,但它确实存在,而且一直存在,而且从来没有出现过问题,我的应用程序将此作为一项功能使用

但是现在我刚刚安装了IE9,对象仍然存在,但是在这个特殊的情况下,
UserData
是一个javascript对象(
Data
对象),它包含一个指向外部C#对象(
Browser
对象)的指针(或者你怎么称呼它),我得到了一个“权限被拒绝”的javascript错误。(如果我没有在同一个页面中导航和运行两个脚本,那么在两个IE版本上都可以正常工作。)

我知道我的例子是无用的,但它只是一个样本。在其他情况下,让javascript对象包含指向外部C#对象的对象也很有用


因此,即使这是一个非常特殊的问题,您对我可以做些什么来解决它,或者为什么我在IE9中遇到这个问题有什么建议吗?

听起来您希望数据在页面之间保持不变。您是否考虑过以下任何一项:

  • 将用户数据存储为cookie。在后续页面加载时重新阅读它们

  • 用于在C#代码中承载一个在页面之间持久存在的对象


  • Javascript能够在浏览器“外部”的系统上解决某些问题是一个可怕的概念。浏览器安全系统中的任何漏洞,即使保护得很好,也会被利用。无论发生什么,浏览器安全系统中的任何漏洞都会被利用。我考虑过这一点,我认为这对我的情况不会有问题。这不是安全问题,因为浏览器只能访问您放在那里的内容。好的,我只是使用window.external进行了测试,但它给了我完全相同的问题。Cookie是文本,因此对于我的特殊情况也没有用处:(Cookie只能在给定域内工作,只能包含文本,并且对总大小有相当严格的限制。@jsoldi:您是如何使用
    window.external
    获取该错误的?与上面的代码相同,但我没有将
    Global
    作为参数传递给
    ObjectForScripting
    Global
    并从my javascript代码来自
    window.external
    。因此,我使用
    window.external.UserData
    ,而不是
    Global.UserData
    。但是请记住,我只在我的问题中提到的特定情况下得到一个错误。我的评论的目的是用C实现一个对象,该对象附加到window.external。也就是说,您实现了“UserData”作为一个C#类,具有“GetProperty”和“SetProperty”等方法。此外,对于Cookie,如果您想出了将二进制数据序列化为字符串的方法,您仍然可以使用文本值。有无数种方法可以做到这一点。