【发布时间】:2014-04-23 07:25:33
【问题描述】:
我已经使用 C# 在 .net 2.0 应用程序中实现了异步可插拔协议,它将存储在本地计算机上的 html 文件加载到 MemoryStream 中。
当我使用本地文件路径在 webbrowser 控件中正常加载 html 文件时,xmlhttprequest 工作正常,但通过协议加载文件并尝试使用 xmlhttprequest 返回访问被拒绝错误。
我推测这种行为是由于 webbrowser 控件不再知道 html 文件存储在本地计算机上,并且正在将它们加载到不受信任的 Internet 区域中。
即使我在 IInternetSecurityManager 的 ProcessUrlAction 中为 URLACTION_CROSS_DOMAIN_DATA 返回 S_OK,我用断点检查以确保它被触发,但我的 IInternetSecurityManager 的此操作的返回值被忽略了。
我尝试在 IInternetSecurityManager 的 MapUrlToZone 中为我的协议 URL 将 pdwZone 设置为 tagURLZONE.URLZONE_LOCAL_MACHINE 并使用 GetSecurityId 进行了一些操作,尽管我不确定我在做什么并且破坏了其他事情,例如允许脚本加载等...似乎没有什么可以允许跨域 xmlhttprequest。
任何人都知道我怎样才能让它工作。
【问题讨论】:
-
你可以试试feature control,但我对此不抱太大希望。使用基于
HttpListener的小型应用内 Web 服务器和用户http://localhost而不是您的自定义 APP 处理程序,您可能会更好。 -
@Noseratio 感谢您的评论。我正在处理的项目不是单实例,并且可以在一台机器上运行多达 20 次,所以我不喜欢 http 侦听器方法,最初我不喜欢潜在的防火墙问题的想法。我确定APP是应该完成的方式。 GetSecurityId 这里的实现对我不起作用:link
-
cEXWB2 at link 有不同的签名,对我也不起作用:
//private const string m_strSecurity = "None:localhost+My Computer"; int IInternetSecurityManager.GetSecurityId(string pwszUrl, IntPtr pbSecurityId, ref uint pcbSecurityId, ref uint dwReserved) { //pbSecurityId = Marshal.StringToCoTaskMemAnsi(m_strSecurity); //pcbSecurityId = (uint)m_strSecurity.Length; //return Hresults.S_OK; return (int)WinInetErrors.INET_E_DEFAULT_ACTION; }我找不到太多关于它的信息。 -
JasperS,您可能正在按照应有的方式进行操作。只是我有一种感觉,从IE9开始,APP的东西就被微软默默地弃用了,从那以后也没有得到很好的测试和维护。你试过玩
FEATURE_PROTOCOL_LOCKDOWN和FEATURE_LOCALMACHINE_LOCKDOWN吗? -
@Noseratio doh,我刚刚查看了我的提供者代码,并意识到我在
IntPtr上缺少ref。不过,这对我奇怪的IHostBehaviorInit问题没有任何影响:(
标签: c# .net vb.net xmlhttprequest webbrowser-control