C# 通过javascript设置iframe的useragent

C# 通过javascript设置iframe的useragent,c#,javascript,jquery,asp.net-mvc,iframe,C#,Javascript,Jquery,Asp.net Mvc,Iframe,试图满足的业务需求:在iframe中加载现有页面,模拟iPhone用户代理。需要在客户端执行此操作的原因是,存在客户端脚本,用于检测用户代理并将一些类附加到html元素上。基于此,当CSS以基于html类的元素为目标时,站点的样式将发生根本性的变化 所以它需要把它变成,或者在我试图解决的情况下,等等 在chrome中使用window.openworks(如本代码所示)。该站点使用适当的移动样式进行渲染 使用iframe可以工作,但只能在FF中工作 理想情况下,我希望iframe版本能够在Chro

试图满足的业务需求:在iframe中加载现有页面,模拟iPhone用户代理。需要在客户端执行此操作的原因是,存在客户端脚本,用于检测用户代理并将一些类附加到html元素上。基于此,当CSS以基于html类的元素为目标时,站点的样式将发生根本性的变化

所以它需要把它变成,或者在我试图解决的情况下,等等

在chrome中使用window.openworks(如本代码所示)。该站点使用适当的移动样式进行渲染

使用iframe可以工作,但只能在FF中工作

理想情况下,我希望iframe版本能够在Chrome和FF中工作

有什么想法吗

<script type="text/javascript">


        navigator.__defineGetter__('userAgent', function () {
            return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5';
        });

        var win = window.open('/home/get');
        win.navigator.__defineGetter__('userAgent', function () {
            return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5';
        });
        win.location.href = '/home/get'; //required


        $(function () {
            var frame = $('<iframe width="320" height="480"></iframe>');
            frame.hide();
            $('#container').append(frame);


            (frame[0].contentWindow || frame[0].contentDocument).navigator.__defineGetter__('userAgent', function () {
                return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5';
            });
            frame.attr('src', '/home/get');

            });


            frame.fadeIn();
        });
    </script>

导航器。__定义设置('userAgent',函数(){
返回“Mozilla/5.0(iPhone;U;CPU iPhone OS 4_3_2,如Mac OS X;en us)AppleWebKit/533.17.9(KHTML,如Gecko)版本/5.0.2 Mobile/8H7 Safari/6533.18.5”;
});
var win=window.open('/home/get');
win.navigator.___________('userAgent',函数(){
返回“Mozilla/5.0(iPhone;U;CPU iPhone OS 4_3_2,如Mac OS X;en us)AppleWebKit/533.17.9(KHTML,如Gecko)版本/5.0.2 Mobile/8H7 Safari/6533.18.5”;
});
win.location.href='/home/get'//必修的
$(函数(){
变量帧=$('');
frame.hide();
$('#container')。追加(框架);
(框架[0]。contentWindow | |框架[0]。contentDocument).navigator._u定义设置('userAgent',函数(){
返回“Mozilla/5.0(iPhone;U;CPU iPhone OS 4_3_2,如Mac OS X;en us)AppleWebKit/533.17.9(KHTML,如Gecko)版本/5.0.2 Mobile/8H7 Safari/6533.18.5”;
});
frame.attr('src','/home/get');
});
frame.fadeIn();
});

使用iframe无法执行类似操作。用户代理在初始请求时随标头一起发送

备选方案:

使用后端代理。iframe实际上是从您自己的服务器加载页面,该服务器通过代理加载远程页面。你可以设置任何你想要的标题。这只有在第三方站点不需要登录时才有效,因为您不想代理用户的会话

如果远程站点支持CORS,您可以从页面执行XHR请求,该请求设置用户代理头并返回页面内容。然后可以将该代码添加到iframe中。小心使用此技术时出现的严重安全问题


我的建议是,拿出一个不同的行动计划。

解决了这个问题,它适用于FF、Chrome和IE。我不确定Safari,因为我没有安装它。它的概要是发出ajax请求,获取html,然后打开iframes文档打开它之后,覆盖它的userAgent getter,然后编写从ajax调用收到的html

        $(function () {
        var frame = $('<iframe width="320" height="480"></iframe>');
        frame.hide();

        $('#container').append(frame);
        var contentWindow = frame[0].contentWindow || frame[0].contentDocument;

        var setUA = function() {
            if (Object.defineProperty) {
                Object.defineProperty(contentWindow.navigator, 'userAgent', {
                    configurable: true,
                    get: function () {
                        return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5';
                    }
                });
            } else if (Object.prototype.__defineGetter__) {
                contentWindow.navigator.__defineGetter__('userAgent', function () {
                    return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5';
                });
            } else {
                alert('browser not supported');
            }
        };

        $.ajax({
            cache: false,
            url: '/home/get',
            success: function (html) {
                contentWindow.document.open();
                setUA();
                contentWindow.document.write(html);
                contentWindow.document.close();
                frame.fadeIn();
            }
        });
    });
$(函数(){
变量帧=$('');
frame.hide();
$('#container')。追加(框架);
var contentWindow=frame[0]。contentWindow | | frame[0]。contentDocument;
var setUA=函数(){
if(Object.defineProperty){
Object.defineProperty(contentWindow.navigator,'userAgent'{
对,,
get:function(){
返回“Mozilla/5.0(iPhone;U;CPU iPhone OS 4_3_2,如Mac OS X;en us)AppleWebKit/533.17.9(KHTML,如Gecko)版本/5.0.2 Mobile/8H7 Safari/6533.18.5”;
}
});
}else if(Object.prototype.\uuu defineGetter\uuuu){
contentWindow.navigator.\uuuuuu定义设置器\uuuuuu('userAgent',函数(){
返回“Mozilla/5.0(iPhone;U;CPU iPhone OS 4_3_2,如Mac OS X;en us)AppleWebKit/533.17.9(KHTML,如Gecko)版本/5.0.2 Mobile/8H7 Safari/6533.18.5”;
});
}否则{
警报(“不支持浏览器”);
}
};
$.ajax({
cache:false,
url:“/home/get”,
成功:函数(html){
contentWindow.document.open();
setUA();
contentWindow.document.write(html);
contentWindow.document.close();
frame.fadeIn();
}
});
});

1)我已经实现了一个代理,通过c#webclient请求处理任何UA字符串。但是,这并不能满足客户端的需求,这需要使用浏览器用户代理。2) 我不能通过xhr(到我自己的代理页面)来实现这一点,因为同样,生成的客户端脚本将针对当前的浏览器用户代理运行。3) 在FF中,它确实有效。我想知道是否有人在Chrome中成功地做到了这一点。你能用你目前所拥有的设置一个JSFIDLE吗?也许真的能找到答案。